Django整合Extjs Crsf Json(二)

本文详细介绍了在使用Django框架时如何处理Crsf验证问题,确保表单提交的安全性,并封装了Json结果和Ajax请求的装饰器,以提升用户体验和代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Crsf

Extjs里面所有的表单都是通过Ajax提交的,所以会被Crsf所拦截

所以在每个页面需要引入如下js,主要是在提交表单时设置 crsf信息

//crsf验证
Ext.Ajax.on('beforerequest', function (conn, options) {
    if (!(/^http:.*/.test(options.url) || /^https:.*/.test(options.url))) {

        if(Ext.util.Cookies.get('csrftoken')==null){
            Ext.util.Cookies.set('csrftoken','csrftoken')
        }
        if (typeof(options.headers) == "undefined") {
            options.headers = {'X-CSRFToken': Ext.util.Cookies.get('csrftoken')};
        } else {
            options.headers['X-CSRFToken']=Ext.util.Cookies.get('csrftoken');
        }
    }
}, this);

2. 封装Json结果和Ajax请求装饰器

import datetime
import decimal

from django.http import Http404, HttpResponse
from django.utils import simplejson
from django.utils.timezone import is_aware
from django.db import models
from science import settings
from const import Const

from django.core.serializers import serialize
from django.utils.simplejson import dumps, loads
from django.db.models.query import QuerySet, ValuesQuerySet
from django.utils.functional import curry


class DjangoJSONEncoder(simplejson.JSONEncoder):
	"""
		JSONEncoder subclass that knows how to encode date/time and decimal types.
	"""
	def default(self, o):
		# See "Date Time String Format" in the ECMA-262 specification.
		if isinstance(o, datetime.datetime):
			return o.strftime('%Y年%m月%d日')
		elif isinstance(o, datetime.date):
			return o.isoformat()
		elif isinstance(o, datetime.time):
			if is_aware(o):
				raise ValueError("JSON can't represent timezone-aware times.")
			r = o.isoformat()
			if o.microsecond:
				r = r[:12]
			return r
		elif isinstance(o, decimal.Decimal):
			return str(o)
		elif isinstance(o,ValuesQuerySet):
			return list(o)
		elif isinstance(o, QuerySet):
			return loads(serialize('json', o))
		elif isinstance(o, models.Model):
			return dict([(attr, getattr(o, attr)) for attr in [f.name for f in o._meta.fields]])
		else:
			return super(DjangoJSONEncoder, self).default(o)


dumps = curry(dumps, cls=DjangoJSONEncoder)

def Ajax(fn):
	def wrapper(*args, **kv):
		request = args[0]
		if not  settings.DEBUG and\
		not request.is_ajax():
			raise Http404
		result= fn(*args, **kv)
		result=dumps(result)
		return HttpResponse(result,mimetype="application/json")
	return wrapper

TODO ....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值