찾다

 >  Q&A  >  본문

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

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 = """
        <script type="text/javascript">
        window.parent.CKEDITOR.tools.callFunction(%s, '%s', '%s');
        </script>
        """ % (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代码:


<p class="field-box">
<textarea name="context" class="span12 " type="text" rows="9" required></textarea>

<script>
CKEDITOR.replace('context');
</script>
迷茫迷茫2825일 전1023

모든 응답(1)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-17 15:44:12

    check_xsrf_cookie() 메서드를 재정의하고 업로드 요청을 확인하지 않도록 선택할 수 있습니다
    방금 토네이도 소스 코드를 봤는데 이렇게만 하면 됩니다

    ckeditor.js의 소스 코드를 수정하고 <form enctype="multipart/form-data" method="POST" ... 행을 찾은 다음(검색하여 찾을 수 있음) 양식을 생성하는 코드를 편집하고 입력, type=hidden 및 값을 추가합니다. 쿠키 _xsrf 값에서 가져옴) 이것이 작동합니다.

    html에서는 여전히 {% module xsrf_form_html() %}를 작성해야 합니다(tornado 소스 코드에서 xsrf_form_html()을 실행하면 set_cookie('_xsrf')를 호출함). 쿠키 _xsrf 값이 있으면 위에서 언급한 방법을 사용하여 가져오세요.

    js가 쿠키 코드를 가져옵니다(tornado 문서에서 가져옴).

    으아아아

    PS: 저도 토네이도 팬입니다. 위의 방법을 실천해봤는데 가능합니다.

    회신하다
    0
  • 취소회신하다