Python全棧之路-Django(十三)

1 Django請求生命週期:

中間件 -> 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()

2 MVC和MTV

models(數據庫,模型) views(html模板) controllers(業務邏輯處理) --> MVCsession

models(數據庫,模型) templates(html模板) views(業務邏輯處理) --> MTVmvc

Django -> MTVapp

3 中間件

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

4 Form驗證

普通的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>
相關文章
相關標籤/搜索