xsrf form html,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代码:

<div class="field-box">

<textarea name="context" class="span12 " type="text" rows="9" required></textarea>

<script>

CKEDITOR.replace('context');

</script>

你可以选择重写

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党哈,以上方法实践过了,可行。

3431402c1bcafac7e7cfb291f3f55629.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值