python - tornado开启了xsrf_cookies,在ckeditor中上传文件如何传入xsrf_form_html()?

 吉祥话如意 发布于 2022-10-31 12:55

tornado在setting中设置了"xsrf_cookies" : True,则需要在表单中添加{% module xsrf_form_html() %}。
但ckeditor如何传xsrf_cookies这个值,每次上传图片都显示'_xsrf' argument missing from POST。
如果把"xsrf_cookies"设置为False则上传成功。

下面是上传的代码

class ckuploadHandeler(BaseHandler):
    @authenticated
    def gen_rnd_filename(self):
        filename_prefix = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
        return '%s%s' % (filename_prefix, str(random.randrange(1000, 10000)))



    @authenticated
    def post(self):

        """CKEditor file upload"""
        error = ''
        url = ''
        callback = self.get_argument("CKEditorFuncNum")

        if self.request.method == 'POST' and 'upload' in self.request.files:
            fileobj = self.request.files['upload']

            fname, fext = os.path.splitext(fileobj[0]['filename'])
            rnd_name = '%s%s' % (self.gen_rnd_filename(), fext)
            filepath = os.path.join(self.settings['static_path'], 'upload', rnd_name)
            # 检查路径是否存在,不存在则创建
            dirname = os.path.dirname(filepath)
            if not os.path.exists(dirname):
                try:
                    os.makedirs(dirname)
                except:
                    error = 'ERROR_CREATE_DIR'

            elif not os.access(dirname, os.W_OK):
                error = 'ERROR_DIR_NOT_WRITEABLE'
            if not error:
                print(filepath)
                with open(filepath,'wb') as up:      #有些文件需要已二进制的形式存储,实际中可以更改
                    up.write(fileobj[0]['body'])
                urlpath = filename='%s/%s' % ('upload', rnd_name)
                url = self.static_url(urlpath)
                print(url)
        else:
            error = 'post error'
        res = """
        
        """ % (callback, url, error)
        self.write(res)
       

Handler的URL (r'/upload/', ckuploadHandeler),

显示错误`WARNING:tornado.general:403 POST /upload/?CKEditor=context&CKEditorFuncNum=1&langCode=zh (127.0.0.1): '_xsrf' argument missing from POST
`

如何在上传图片的时候把xsrf_cookies也post过去?

html代码:

1 个回答
  • 你可以选择重写check_xsrf_cookie() 方法,对上传这个请求不做检查
    我刚才看了下tornado的源代码,你只要这么做就行

    修改ckeditor.js的源代码,找到 <form enctype="multipart/form-data" method="POST" ...这一行(搜索下就找到)然后编辑下那个生成form的代码,添加一个input进去,type=hidden, value就是从cookie中取_xsrf值)这样行了。

    在html中,你还是需要写{% module xsrf_form_html() %} (在tornado的源代码中,执行xsrf_form_html() 会调用set_cookie('_xsrf')),这样在cookie中就会有_xsrf值了,用上面说得方法带上去就行了。

    js获取cookie代码(取自tornado文档):

    function getCookie(name) {
        var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
        return r ? r[1] : undefined;
    }

    PS: 本人也是tornado党哈,以上方法实践过了,可行。

    2022-10-31 23:01 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有