学会收藏,学会遗忘,更要学会坚强。人生真是有趣,如果没有了这些挫折和困难,那这样的人生还有什么意思!
我为什么要那么努力,一眼看的到头的生活? 是因为充满了对自由世界的渴望,追求自己想要的生活!
总结:
1.由于采用前后端分离,所以我们只关注数据:将用户的请求里面的数据提取到,将Json数据返回回去
2.注意一点,Django的异常类继承自HttpResponse类,所以不能raise,只能return
CSRF处理
默认Django会对所有POST信息做CSRF校验。
CSRF(Cross-site request forgery)跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
CSRF攻击往往难以防范,具有非常大的危险性。
Django提供的CSR F机制
Django第一次响应来自某个客户端的请求时, 会在服务器端随机生成一个token, 把这个token放在
cookie里。然后浏览器端每次POST请求带上这个token, Django的中间件验证, 这样就能避免被CSRF攻击;
解决办法
- 关闭CSRF中间件(不推荐),在真正部署的时候在解决这个问题;
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',# 注释掉
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]- 在POST提交时,需要发给服务器一个csrf_token
模板中的表单Form中增加{% csrf_token %},它返回到了浏览器端就会为cookie增加 csrftoken 字段,
还会在表单中增加一个名为csrfmiddlewaretoken隐藏控件 <input type='hidden'
name='csrfmiddlewaretoken'
value='jZTxU0v5mPoLvugcfLbS1B6vT8COYrKuxMzodWv8oNAr3a4ouWlb5AaYG2tQi3dD' />- 如果使用A JAX进行POST,需要在请求Header中增加X-CSRFTOKEN,其值来自cookie中获取的csrftoken值,为了测试方便,可以选择第一种方法先禁用中间件,测试完成后开启。
注册代码 V1
from django.shortcuts import render
from django.http import JsonResponse,HttpRequest,HttpResponseBadRequest
import simplejson
from .models import User
# register
def reg(request:HttpRequest):
print(request.GET)
print(request.POST)
print("------------------")
print(request.body)
try: # 有任何异常,都返回400,如果保存数据出错,则向外抛出异常;
payload = simplejson.loads(request.body)
print(type(payload),payload)
email = payload['email']
name = payload['name']
password = payload['password']
print(email,name,password)
user = User()
user.email = email
user.name = name
user.password = password
try:
user.save()
return JsonResponse({'user_id':user.id}) #正常,返回Json数据;
except Exception as e:
raise
except Exception as e: #有任何异常 抛出异常;
print(e)
return HttpResponseBadRequest('参数错误')
邮箱检查
邮箱检查需要查user表,需要使用User类的filter方法。
email=email,前面是字段名email,后面是email变量。查询后返回结果,如果查询有结果,则说明该email已经存在,邮箱已经注册,返回400到前端。
用户信息存储
创建User类实例,属性存储数据,最后调用save方法。Django默认是在save()、delete()的时候事务自动提交。
如果提交抛出任何错误,则捕获此异常做相应处理。
异常处理
- 出现获取输入框提交信息异常,就返回异常
- 查询邮箱存在,返回异常
- save()方法保存数据,有异常,则向外抛出,捕获返回异常
- 注意一点,Django的异常类继承自HttpResponse类,所以不能raise,只能return
- 前端通过状态码判断是否成功
下面我们说说模型类的操作;
from django.shortcuts import render
# Create your views here.
from django.http import JsonResponse,HttpRequest,HttpResponseBadRequest
import simplejson
from .models import User
# register
def reg(request:HttpRequest):
print(request.GET)
print(request.POST)
print("------------------")
print(request.body)
try:
payload = simplejson.loads(request.body)
print(type(payload),payload)
email = payload['email']
query = User.objects.filter(email=email)
print(type(query))
if query.first(): # email 如果存在,则return error;
print('============================')
return HttpResponseBadRequest('用户名已存在')
# print(query.query)
name = payload['name']
password = payload['password']
print(email,name,password)
user = User()
user.email = email
user.name = name
user.password = password
try:
user.save()
return JsonResponse({'user_id':user.id})
except Exception as e:
raise
except Exception as e:
print(e)
return HttpResponseBadRequest('参数错误')
Django日志
Django的日志配置在settings.py中。
必须DEBUG=True,否则logger的级别够也不打印日志。
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG',
},
},
}
网友评论