中間件 -> url -> 視圖函數html
Web框架的本質是socketweb
Django框架自己沒有socket 使用的是第三方的socket
第三方的socket有不少,可是他們都須要遵循WSGI
規則,經常使用的第三方socket有,Django默認用wsgiref
生產中使用uwsgi
。數據庫
Wsgi+Django生命週期: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', 8000, RunServer) httpd.serve_forever()
models(數據庫,模型) views(html模板) controllers(業務邏輯處理) --> MVCsession
models(數據庫,模型) templates(html模板) views(業務邏輯處理) --> MTVmvc
Django -> MTVapp
django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束後,django會根據本身的規則在合適的時機執行中間件中相應的方法。框架
在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每個元素就是一箇中間件,以下圖。socket
應用:對全部請求或一部分請求作批量處理函數
中間件中能夠定義五個方法,分別是:
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) *****
以上方法的返回值能夠是None和HttpResonse對象,若是是None,則繼續按照django定義的規則向下執行,若是是HttpResonse對象,則直接將該對象返回給用戶。
md.py
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse 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') # 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') 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 def process_exception(self, request, exception): print('m2.process_exception') return HttpResponse('錯誤了...')
settings.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', ]
普通的form表單存在的問題:
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_message=)
2 使用
obj = xxx(request.POST) # 是否校驗成功 v = obj.is_valid() # html標籤name屬性 = Form類字段名 # 全部錯誤信息 obj.errors # 正確信息 obj.cleaned_data
Form示例:
urls.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), ]
app01.views.py
from django.forms import Form from django.forms import fields class LoginForm(Form): # 本質是正則驗證 username = fields.CharField( max_length=18, min_length=6, required=True, error_messages={ 'required': '用戶名不能爲空', 'max_length': '太長了', 'min_length': '過短了', } ) password = fields.CharField(min_length=16, required=True) def login(request): if request.method == 'GET': return render(request,'login.html') else: obj = LoginForm(request.POST) if obj.is_valid(): # 用戶輸入正確 print(obj.cleaned_data) # 字典類型 else: # 用戶輸出錯誤 # print(obj.errors) print(obj.errors['username'][0]) print(obj.errors['password'][0]) return render(request,'login.html',{'obj': obj})
templates.login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> {% csrf_token %} <p><input type="text" name="username">{{ obj.errors.username.0 }}</p> <p><input type="text" name="password">{{ obj.errors.password.0 }}</p> <input type="submit" value="提交"> </form> </body> </html>