热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅谈Django的生命周期和CBF和FBC

Django的生命周期和CBF和FBC对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端,客户端和服务端通信࿰

Django的生命周期和CBF和FBC

对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端,客户端和服务端通信,字符串(Http协议):请求头和请求体
响应头+响应体

3sLAE6U.png

而对于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类中去看看如下:

Z0EZhBJ.png

在View这个类中我们看到有一个dispatch的函数,不难看出我们知道了
这是一个反射函数的执行,这个反射的列表http_method_allowed
如下图所示:

zNMcCbU.png

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')

整个执行的过程如下图所示:

2UnOpqZ.png

同时需要提醒的是在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')

转:https://www.cnblogs.com/lijian-22huxiaoshan/p/7563362.html



推荐阅读
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • DRF类视图让你的代码DRY起来
    刚开始写views.py模块的代码,一般都是用def定义的函数视图,不过DRF更推荐使用class定义的类视图,这能让我们的代码更符合DRY(Don'tRepeatYour ... [详细]
  • 一、django      1、中间件           中间件一般做认证或批量请求处理,django中的中间件,其实是一个类,在请求和结束后,django会根据自己的规则在合适 ... [详细]
  • 最近在准备比赛,打sqlilabs时看了一下sqlmap的wiki,发现了–csrf-token和–csrf-url的参数,于是写了个ph ... [详细]
  • HTMLformwithoutCSRFprotectionHTML表单没有CSRF保护CSRF是伪造客户端请求的一种攻击,CSRF的英文全称是CrossSiteRequestFor ... [详细]
  • v.1.2.beta4Igetthefollowingerrorwhentryingtodeleteauserfromtheadmin ... [详细]
  • 如何防止模拟的http的恶意请求?
    http:www.dewen.ioq5511我有一串URLwww.abc.com?paraxxx在页面中点击按钮后用ajax执行此URL后,后台会执行一些操作 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文讨论了一个关于正则的困惑,即为什么一个函数会获取parent下所有的节点。同时提出了问题是否是正则表达式写错了。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 前端跨域访问后端数据的方法
    参考链接:https:mp.weixin.qq.coms4G_27oRLSMMYBFvtYZgqcg一、什么是跨域当两个域名的协议、子域名、主域名、端口号中有任意一个不 ... [详细]
  • 利用HTTP Host header头攻击技术详解
    利用HTTPHostheader头攻击技术详解一般通用web程序是如果想知道网站域名不是一件简单的事情,如果用一个固定的URI来作为域名会有各种麻烦。开发人员一般是 ... [详细]
author-avatar
DilWilling
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有