热门标签 | 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



推荐阅读
  • 本文深入探讨了 Vue.js 中异步组件的应用与优化策略。首先,文章介绍了异步组件的基本概念及其在现代前端开发中的重要性。为了确保最佳实践,建议使用 Webpack 作为模块打包工具,因为 Browserify 默认不支持异步组件的加载。接着,详细解释了异步组件的使用方法,并提供了官方文档的相关链接以供参考。此外,文章还讨论了多种优化技巧,包括代码分割、懒加载和性能调优,以提升应用的整体性能和用户体验。 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
  • 初次接触AJAX是在去年,当时主要是通过手动编写客户端代码来实现,还需处理被请求的页面,过程相当繁琐。尽管之前就听说过AJAX.NET,但一直没有机会深入了解。本文将作为初学者的指南,详细介绍AJAX.NET的基本概念、核心功能及其在实际项目中的应用技巧,帮助读者快速上手并掌握这一强大的开发工具。 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • 探索JavaScript倒计时功能的三种高效实现方法及代码示例 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 需求:在指定的DIV区域内点击时,需展示该区域内的附加操作面板;而在区域外点击时,则应自动隐藏该附加操作面板。通过精准的事件监听与处理,确保用户交互体验的流畅性和直观性。 ... [详细]
  • HTML5大文件传输技术深度解析与实践分享
    本文深入探讨了HTML5在Web前端开发中实现大文件上传的技术细节与实践方法。通过实例分析,详细讲解了如何利用HTML5的相关特性高效、稳定地处理大文件传输问题,并提供了可供参考的代码示例和解决方案。此外,文章还讨论了常见的技术挑战及优化策略,旨在帮助开发者更好地理解和应用HTML5大文件上传技术。 ... [详细]
  • 如何在PHP中实现链接输出与字符串连接的操作技巧 ... [详细]
  • 本文介绍了一种专为清洁工人设计的自定义文本烟花效果。通过该功能,用户可以输入特定的感谢或祝福语句,系统将生成绚丽的烟花动画,以表达对清洁工人的敬意和感激之情。该特效不仅美观,还能增强用户的互动体验,提升公共场合的氛围。 ... [详细]
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社区 版权所有