Django的生命周期和CBF和FBC
对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端,客户端和服务端通信,字符串(Http协议):请求头和请求体
响应头+响应体
而对于Django这个web框架其整个请求的生命周期如上图所示
需要提别提醒的是大部分人以为Django内部封装了socket,其实不然,Django的socket是没有封装的,而是外部插件。
路由系统(FBV&CBV)
一、FBV(function base view)
在Django的url中我们可以根据一个URL对应一个函数名来定义路由规则如下:
urlpatterns = [url(r'^admin/$', admin.site.urls),url(r'^index/$', views.index),url(r'^ajaxHandel/$', views.ajaxHandel),url(r'^login/$', views.login),url(r'^ajaxlogin/$', views.ajaxlogin),url(r'^reg/$', views.reg),url(r'^set_password/$', views.set_password),
]
这里需要注意的是:当客户访问过来请求的时候,到达路由系统后是根据正则来匹配的,如果上面的匹配成功了,后面的路由规则将不会继续匹配,需要注意!!!!所以我们在后面都加一个$来做结尾.
二、CBV(class base view)
除可以使用常规的函数去设置Django的视图函数,我们也可以使用类去定义视图如:
url
urlpatterns = [url(r'^admin/$', admin.site.urls),url(r'^index.html$',views.IndexView.as_view()),
]
这里需要注意当我们使用class去定义视图时需要在url中继承一个as_view()的类
views
对应的视图:
from django.shortcuts import render,HttpResponse
from django.views import View #class视图需要导入Viewclass IndexView(View): #继承Viewdef get(self,request,*args,**kwargs):return render(request,'index.html')def post(self,request,*args,**kwargs)return HttpResponse("whatmini")
通过class定义的视图,可以清楚的界定出client端的请求时get请求还是post请求,并执行相应的操作。
View
我们会有疑问在执行get和post的函数之前class IndexView(View)这个类发生了什么?
所以我们需要进入到它继承的View类中去看看如下:
在View这个类中我们看到有一个dispatch的函数,不难看出我们知道了
这是一个反射函数的执行,这个反射的列表http_method_allowed
如下图所示:
dispatch设置验证
通过上面的View的源码我们知道了在用类定义视图时首先需要执行的是dispatch函数,所以现在我们可以使用dispatch设置用户登录的关卡:
from django.shortcuts import render,HttpResponse,redirect
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protectclass LoginView(View):def dispatch(self,request,*args,**kwargs):return super(LoginView,self).dispatch(request, *args, **kwargs)def get(self,request):return render(request,'login.html')def post(self,request):# request.GET# request.POST # 请求头中的:content-type# request.bodyuser = request.POST.get('user')pwd = request.POST.get('pwd')if user == 'whatmini' and pwd == "4324225":# 生成随机字符串# 写浏览器COOKIE: session_id: 随机字符串# 写到服务端session:# {# "随机字符串": {'user_info':'whatmini}# }request.session['user_info'] = "whatmini"return redirect('/index.html')return render(request, 'login.html')class AuthView(View):def dispatch(self, request, *args, **kwargs):if not request.session.get('user_info'): return redirect('/login.html')res = super(AuthView,self).dispatch(request, *args, **kwargs) return res #在源码中反射的函数有return值所以这里同样要将res的只return出来class IndexView(AuthView):def get(self,request,*args,**kwargs):"""获取数据:param request::param args::param kwargs::return:"""return render(request,'index.html')def post(self,request,*args,**kwargs):"""提交数据:param request::param args::param kwargs::return:"""return HttpResponse('999')class OrderView(AuthView,View):def get(self,request,*args,**kwargs):"""获取数据:param request::param args::param kwargs::return:"""return render(request,'index.html')def post(self,request,*args,**kwargs):"""提交数据:param request::param args::param kwargs::return:"""return HttpResponse('999')
整个执行的过程如下图所示:
同时需要提醒的是在form表单提交(只支持两种):GET,POST
Ajax提交数据(提交方式都支持):['get'获取, 'post'创建, 'put'更新, 'patch'局部更新, 'delete'删除, 'head', 'options', 'trace'] -> restful规范
装饰器
Django中使用装饰器必须的继承method_decorator:
from django.utils.decorators import method_decorator
get,post方法上
class LoginView(View):def dispatch(self, request, *args, **kwargs):return super(LoginView,self).dispatch(request, *args, **kwargs)def get(self,request):return render(request,'login.html')@method_decorator(test)def post(self,request):# request.GET# request.POST # 请求头中的:content-type# request.bodyuser = request.POST.get('user')pwd = request.POST.get('pwd')if user == 'alex' and pwd == "alex3714":# 生成随机字符串# 写浏览器COOKIE: session_id: 随机字符串# 写到服务端session:# {# "随机字符串": {'user_info':'alex}# }request.session['user_info'] = "alex"return redirect('/index.html')return render(request, 'login.html')
dispatch方法上
class LoginView(View):@method_decorator(test) #表示给get和post同时装上装饰器def dispatch(self, request, *args, **kwargs):return super(LoginView,self).dispatch(request, *args, **kwargs)def get(self,request):return render(request,'login.html')def post(self,request):# request.GET# request.POST # 请求头中的:content-type# request.bodyuser = request.POST.get('user')pwd = request.POST.get('pwd')if user == 'alex' and pwd == "alex3714":# 生成随机字符串# 写浏览器COOKIE: session_id: 随机字符串# 写到服务端session:# {# "随机字符串": {'user_info':'alex}# }request.session['user_info'] = "alex"return redirect('/index.html')return render(request, 'login.html')
类上
@method_decorator(test,name='get') #加上name=get表示只给get装上装饰器class LoginView(View):def dispatch(self, request, *args, **kwargs):return super(LoginView,self).dispatch(request, *args, **kwargs)def get(self,request):return render(request,'login.html')def post(self,request):# request.GET# request.POST # 请求头中的:content-type# request.bodyuser = request.POST.get('user')pwd = request.POST.get('pwd')if user == 'alex' and pwd == "alex3714":# 生成随机字符串# 写浏览器COOKIE: session_id: 随机字符串# 写到服务端session:# {# "随机字符串": {'user_info':'alex}# }request.session['user_info'] = "alex"return redirect('/index.html')return render(request, 'login.html')
特殊:CSRF Token只能加到dispatch
from django.views.decorators.csrf import csrf_exempt,csrf_protectclass LoginView(View):@method_decorator(csrf_exempt) #表示在post请求时不需要COOKIE验证def dispatch(self, request, *args, **kwargs):return super(LoginView,self).dispatch(request, *args, **kwargs)def get(self,request):return render(request,'login.html')def post(self,request):# request.GET# request.POST # 请求头中的:content-type# request.bodyuser = request.POST.get('user')pwd = request.POST.get('pwd')if user == 'alex' and pwd == "alex3714":# 生成随机字符串# 写浏览器COOKIE: session_id: 随机字符串# 写到服务端session:# {# "随机字符串": {'user_info':'alex}# }request.session['user_info'] = "alex"return redirect('/index.html')return render(request, 'login.html')