一、什么是WSGI?

WEB框架的本质是一个socket服务端接收用户请求,加工数据返回给客户端(Django),但是Django没有自带socket需要使用 别人的 socket配合Django才能正常运行,socket有很多如下,  但是它们必须遵循一个规范 WSGI(web服务网关接口)这个所有socket都遵守的规范就是WSGI。

Django默认使用: wsgiref socket(并发性能低 测试使用)

在公司生产系统上一般用uwsgi+nginx+Django结合使用

wsgiref +Django工作流程

1.socket 接受客户端请求 做http请求解析(分割请求头请求体)

2.wsgiref 把解析之后请求相关信息转发 给 Django

3.Django框架开始从:中间件-->路由系统(url)-->视图函数(views)、ORM操作(操作数据库,增删改查)、模板渲染(前端输入数据)最终return字符串给socket

4.socket send (Django产出的字符串),返回客户端

Wsgi+Django
from wsgiref.simple_server import make_server def RunServer(environ, start_response): Django框架开始
中间件
路由系统
视图函数
。。。。。 start_response('200 OK', [('Content-Type', 'text/html')]) return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] if __name__ == '__main__':
httpd = make_server('127.0.0.1', , RunServer)
httpd.serve_forever()

二、MVC/MTV是什么?

是不有人经常在你面前 装B的提起 MVC 和MTV?

说白了就是做功能模块的划分,把不同的代码放到不同的文件。

MVC

models(数据库,模型)

views(html模板)

controllers(业务逻辑处理,函数) --> MVC

MTV

models(数据库,模型)

templates(html模板)

views(业务逻辑处理函数) --> MTV (Django属于 MTV)

中间件:

http请求周期:
用户在浏览器输入url,在路由系统进行匹配,然后找到视图函数,
然后取数据,拿模板渲染,把字符串返回给用户

url----->中间件(管道)---->路由系统(url匹配)-->找到视图函数,取数据,拿模板渲染,给用户返回一个大的字符串

url------>中间件(class->class->class->class...)----->/login---------->def login(request)
中间件是由几个类组成,经过类的方法

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',
]

用户发请求,发给中间件middleware.security.SecurityMiddleware的方法1,再依次经过各个中间件的方法1,
再发到视图函数,视图函数的返回值(return HttpResponse() render(),redirect() )
把返回值按照各个中间件的方法2返回给用户 csrf:{% csrf_token %} 黑名单(ip1,ip2,ip3,ip4,ip5,ip6......)
def process_request(self, request)
def process_response(self, request, response) 请求这里不能有return返回值,响应这里必须有返回值 from django.utils.deprecation import MiddlewareMixin class Midlle1(MiddlewareMixin):
def process_request(self, request):
print('m1.process_request')
# return request 可以不写,Django会自动传递
如果请求写返回值,不会继续往下走,会提前结束
def process_response(self, request, response):
print('m1.process_response')
return response class Midlle1(MiddlewareMixin):
def process_request(self, request):
print('m1.process_request')
# return request 可以不写,Django会自动传递
# return HttpResponse('不要再往下走了')
def process_response(self, request, response):
print('m1.process_response')
return response class Midlle2(MiddlewareMixin):
def process_request(self, request):
print('m2.process_request')
# return request 可以不写,Django会自动传递
# return HttpResponse('不要再往下走了')
def process_response(self, request, response):
print('m2.process_response')
return response

自定义中间件

Django 1.10版本之后,遇到return就返回,如果到了公司,有时候会遇到Django1.7或者1.8,遇到return 会找到最后的中间件的response,才返回

from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
def process_request(self,request):
print('m1.process_request') def process_view(self, request, callback, callback_args, callback_kwargs):
print('m1.process_view') def process_response(self,request,response):
print('m1.process_response')
return response class M2(MiddlewareMixin):
def process_request(self, request):
print('m2.process_request') def process_view(self, request, callback, callback_args, callback_kwargs):
print('m2.process_view') def process_response(self, request, response):
print('m2.process_response')
return response '''
m1.process_request
m2.process_request
m1.process_view
m2.process_view
test
m2.process_response
m1.process_response
'''

md.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/', views.test),
url(r'^login/', views.login),
]

urls.py

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',
'md.M1',
'md.M2',
]

中间件注册

终极版:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect,render
class M1(MiddlewareMixin):
def process_request(self,request):
print('m1.process_request') def process_view(self, request, callback, callback_args, callback_kwargs):
# print(callback, callback_args, callback_kwargs)#路由匹配<function test at 0x000000BC53849A60> () {}
print('m1.process_view')
# response = callback(request,*callback_args,**callback_kwargs)
# return response def process_response(self,request,response):
print('m1.process_response')
return response def process_exception(self,request,exception):
print('m1.process_exception') def process_template_response(self,request,response):
print('m1.process_template_response')
return response
class M2(MiddlewareMixin):
def process_request(self, request):
print('m2.process_request')
#view_func视图函数:callback
def process_view(self, request, callback, callback_args, callback_kwargs):
# print(callback,callback_args,callback_kwargs)#<function test at 0x0000001B0F2E9A60> () {}
print('m2.process_view')
# response = callback(request,*callback_args,**callback_kwargs)
# return response
def process_response(self, request, response):
print('m2.process_response')
return response
def process_exception(self,request,exception):
print('m2.process_exception')
return HttpResponse('错误了......') def process_template_response(self,request,response):
print('m2.process_template_response')
return response
"""
视图函数的返回值中,如果有render方法,才会被调用执行
"""
'''
m1.process_request
m2.process_request
m1.process_view
test
m2.process_response
m1.process_response
''' '''
m1.process_request
m2.process_request
m1.process_view
m2.process_view
test
m2.process_response
m1.process_response
'''
#五种中间件:最常用的是:process_request和process_response
# process_request(self,request)
# process_view(self, request, callback, callback_args, callback_kwargs)
# process_template_response(self,request,response)
# process_exception(self, request, exception)
# process_response(self, request, response)

md.py

class Foo:
def __init__(self,req,status,msg):
self.req = req
self.status = status
self.msg = msg
def render(self):
ret = {
'status':self.status,
'msg':self.msg
}
return HttpResponse(json.dumps(ret))#返回一个字符串 def test(request):
# obj = Foo(request)
return Foo(request,True,"错误信息")
# print('test')
# # int('asdf')
# return HttpResponse('ok')
"""
视图函数的返回值中,如果有render方法,才会被调用执行
"""
'''
m1.process_request
m2.process_request
m1.process_view
m2.process_view
test
m2.process_exception
m1.process_exception m2.process_response
m1.process_response '''

views.py

m1.process_request
m2.process_request
<function test at 0x000000BC53849A60> () {}
m1.process_view
<function test at 0x000000BC53849A60> () {}
m2.process_view
test
m2.process_response
m1.process_response
process_request有返回值和 process_view有返回值的情况不一样
process_request有返回值时,找到自己的response,自动返回,
process_view有返回值时,会把所有的中间件的response都执行一遍再返回
process_exception 遇到views.py中出现异常时输出,程序正确时不会打印m1.process_exception
ajax请求提交时,返回一个ret,还有一个json.dumps

中间件使用

缓存(memcache,redis) 去内存拿数据比硬盘快,请求来时,
先在缓存取,返回给用户,HTTP请求发来时,要对所有请求做一下判断,才用到中间件

- 应用:对所有请求或一部分请求做批量处理

Form表单初识

Form验证:

就是对客户端在form表单中输入的数据,进行正确性验证,验证通过再做ORM操作,验证失败抛出提示信息。

基本使用

from django.shortcuts import render,redirect,HttpResponse
from app01 import models
from django.forms import Form
from django.forms import fields
import json
# Create your views here.
class JSONResponse:
def __init__(self,req,status,msg):
self.req = req
self.status = status
self.msg = msg
def render(self):
ret = {
'status':self.status,
'msg':self.msg
}
return HttpResponse(json.dumps(ret))#返回一个字符串 def test(request):
# obj = Foo(request)
return JSONResponse(request,True,"错误信息") #{"status": true, "msg": "\u9519\u8bef\u4fe1\u606f"}
# print('test')
# # int('asdf')
# return HttpResponse('ok') class LoginForm(Form):
# username = fields.CharField(max_lengtj=,min_length=, required=True)
#正则验证:不能为空,-18位
username = fields.CharField(
max_length=,
min_length=,
required=True,#不能为空
error_messages={
'required':'用户名不能为空',
'min_length':'太短了',
'max_length':'太长了',
}
)
#正则验证:不能为空,+
password = fields.CharField(min_length=,required=True)
error_messages = {
'required': '密码不能为空',
'min_length': '太短了',
'max_length': '太长了',
}
# email = fields.EmailField() 邮箱
# email = fields.GenericIPAddressField() IP
# email = fields.IntegerField() #数字类型

定义JSONResponse类

def login(request):
if request.method == "GET":
return render(request,'login.html')
else:
obj = LoginForm(request.POST)
ret = obj.is_valid()
print(ret)#True or False
if obj.is_valid():
#用户输入的格式正确
print(obj.cleaned_data)#字典类型#{'username': 'rootroot', 'password': 'rootrootrootrootroot'}
return redirect('http://www.baidu.com')
else:
#用户输入格式错误
print(obj.errors)#输出一个对象, <ul class="errorlist"><li>username<ul class="errorlist"><li>用户名太短了</li></ul></li><li>password<ul class="errorlist"><li>Ensure this value has at least characters (it has ).</li></ul></li></ul>
# print(obj.errors['username'][])
# print(obj.errors['password'][])
return render(request,'login.html',{'obj':obj})

定义login函数

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="POST" action="/login/">
{% csrf_token %}
<div>
<p>
用户名:<input type="text" name="username">{{ obj.errors.username. }}
</p>
<p>
密 码:<input type="password" name="password">{{ obj.errors.password. }}
</p> <input type="submit" value="提交"> {{ msg }}
</div>
</form>
</body>
</html>

login.html

        #valid:有效的; 有法律效力的; 正当的; 健全的;
user = request.POST.get('username')
#不能为空,长度5-18位,必须邮箱格式
if len(user) < :
pass pwd = request.POST.get('password')
#不能为空,长度5-18位,包含数字,字母,下划线
if user == 'root' and pwd == '':
return redirect('http://www.baidu.com')
else:
return render(request,'login.html',{'msg':'用户名或密码错误'})

杂项

用户名密码的验证(比如用户名是邮箱格式)
1.用户提交的格式验证,可以减轻数据库的压力
2.当输入值的时候,输入非法的字符
request.POST.get('username')
request.POST.get('password')
注册页面,登录页面(邮箱要用正则表达式验证)
ip,port
- 需要对请求数据做验证
- 获取到数据然后进行验证
邮箱正则(规则写一遍,不需要重复)
- login:
邮箱正则
- register:
邮箱正则

问题:
- 重复进行用户数据校验:正则,长度,是否为空
- 无法记住上次提交内容,刷新页面数据消失

Django提供 Form组件:
1. 定义规则
from django.forms import Form
from django.forms import fields
class xxx(Form):
xx = fields.CharField(required=True,max_lenght.,min,error_messages=)
fields:有一大堆的正则表达式,
CharField:用户输入的数据必须是字符串
required=True:不能为空
error_messages:定义错误信息的中文显示
required=True,max_lenght.,min,error_messages:四个参数
2. 使用
obj = xxx(request.POST)
1).# 是否校验成功
v = obj.is_valid()#怎么匹配
# html标签name属性 = Form类字段名
2).# 所有错误信息
obj.errors

3).# 正确信息
obj.cleaned_data
request.POST要传一个key,也就是前端传的name属性
html中的username和password和views.py中的username一一匹配

is_valid:在内部进行校验
errors:所有的错误信息
cleaned_data:成功之后的正确信息(字典类型)

Django WSGI,MVC,MTV,中间件部分,Form初识的更多相关文章

  1. Django之WSGI 和MVC/MTV

    一.什么是WSGI? WEB框架的本质是一个socket服务端接收用户请求,加工数据返回给客户端(Django),但是Django没有自带socket需要使用 别人的 socket配合Django才能 ...

  2. Python学习笔记整理总结【Django】【MVC/MTV/路由分配系统(URL)/视图函数 (views)/表单交互】

     一.Web框架概述  Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...

  3. Django中间件 及 form 实现用户登陆

    Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误 ...

  4. web开发中的MVC框架与django框架的MTV模式

    1.MVC 有一种程序设计模式叫MVC,核心思想:分层,解耦,分离了 数据处理 和 界面显示 的代码,使得一方代码修改了不会影响到另外一方,提高了程序的可扩展性和可维护性. MVC的全拼为Model- ...

  5. Django基础知识MTV

    Django简介 Django是使用Python编写的一个开源Web框架.可以用它来快速搭建一个高性能的网站. Django也是一个MVC框架.但是在Django中,控制器接受用户输入的部分由框架自行 ...

  6. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  7. day 63 Django基础九之中间件

    Django基础九之中间件   本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学 ...

  8. Django CBV装饰器 中间件 auth模块 CSRF跨站请求

    CBV添加装饰器 给CBV添加装饰器有三种方法,三种方法都需要导入模块: from django.utils.decorators import method_decorator 第一种直接在方法上面 ...

  9. 72、django之简单验证码实现与form表单钩子函数补充

    本篇主要讲解简单的验证码实现,验证码使用基本都是找现成的组件来实现,用代码实现这个简单功能主要是了解了解验证码内部的实现. 本篇导航: 五位验证码图示 代码实现 登录验证 Form组件钩子函数补充 一 ...

随机推荐

  1. python 利用正则构建一个计算器

    该计算器主要分为四个模块: weclome_func函数用来进入界面获取表达式,并判断表达式是否正确,然后返回表达式: add_sub函数用来进行加减运算,如果有多个加减运算,会递归,最后返回对应的值 ...

  2. jstl c:choose>、<c:when>和<c:otherwise>标签的简单使用介绍

    <c:choose>.<c:when>和<c:otherwise>在一起连用,可以实现Java语言中的if-else语句的功能.例如以下代码根据username请求 ...

  3. jvm2

    垃圾回收器的实现: 1.让用户都暂停,不再产生垃圾,就去收集垃圾.新生代用复制算法清理垃圾,老生代用标记整理算法搜集垃圾. 优秀的算法:服务端默认是CMS收集器. %..jvm案例演示 内存: Jco ...

  4. java中数组以及集合

    java中数组: 数组在Java里是一种特殊类型,有别于普通的“类的实例”的对象.但实际数组也是一种对象类型,int[]a = new int[5]  a是在java栈中分配的引用变量,类型是int[ ...

  5. Swoole学习(六)Swoole之定时器的创建与清除

    环境:Centos6.4,PHP环境:PHP7,Swoole2.1(在指定的时间后执行函数,需要1.7.7或更高版本) <?php //----------------------------- ...

  6. Laravel核心解读--异常处理

    异常处理是编程中十分重要但也最容易被人忽视的语言特性,它为开发者提供了处理程序运行时错误的机制,对于程序设计来说正确的异常处理能够防止泄露程序自身细节给用户,给开发者提供完整的错误回溯堆栈,同时也能提 ...

  7. 20135302魏静静Linux内核分析第二周学习总结

    操作系统是如何工作的 1. 小结:计算机是怎样工作的 三个法宝 存储程序计算机.函数调用堆栈.中断机制 两把宝剑 中断上下文.进程上下文的切换 2. 堆栈 堆栈是C语言程序运行时必须的一个记录调用路径 ...

  8. python-作用域和装饰器

    Python 作用域 学习的时机: 基本的数据类型 Python的运算 数字运算 + - * / // ** 逻辑运算 And or not 比较运算 > < == >= <= ...

  9. [转]3个著名加密算法(MD5、RSA、DES)的解析

    MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来.     ...

  10. kotlin 记录(已弃坑)

    kotlin 有些是转载内容 使用nullable值以及空值检测 引用或函数返回值如果可能为null值,则必须显式标记nullable. (在类型后面跟一个问号表示这个对象可能为空,跟两个感叹号表示这 ...