django上课笔记6-MVC,MTV架构-中间件-初识Form组件

一、MVC,MTV架构

  models(数据库,模型) views(html模板) controllers(业务逻辑处理) --> MVC

  models(数据库,模型) templates(html模板) views(业务逻辑处理) --> MTV

  Django -> MTV

二、中间件

在settings配置文件中
    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',
    ]
在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件

自定制两个中间件类,创建md.py
    from django.utils.deprecation import MiddlewareMixin

    class M1(MiddlewareMixin):
        def process_request(self,request):
            print('m1.proccess_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_exception(self, request, exception):
            pass

        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_exception(self, request, exception):
            pass

        def process_response(self,request,response):
            print('m2.process_response')
            return response
            
去settings里添加一下
    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',
    ]
    
运行结果:
m1.proccess_request
m2.process_request
m1.process_view
test
m2.process_response
m1.process_response

当用户请求进来的时候,会先从MIDDLEWARE里从上往下走完proccess_request,接着再返回顶部再重新往下走process_view,遇到了process_view,就会直接跳到视图函数里执行视图函数,不再执行其他的process_view。
从视图函数返回的时候会从M2向上先执行每一个process_exception,然后再返回来M2再向上执行每一个process_response,如果process_exception有返回值Httpresponse被处理了,则不再执行其他process_exception,而是直接从M2的process_response向上执行。

process_request

process_response(...response)
    必须有返回值
    return response
    
process_view
process_exception
process_template_view

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

三、初识Form组件

views.py中
    class LoginForm(Form):
        username = fields.CharField(max_length=8,min_length=4,required=True,
                                    error_messages={
                                        'max_length':'用户名太长',
                                        'min_length':'用户名太短',
                                        'required':'用户名不能为空'
                                    })
        passwd = fields.CharField(max_length=12,required=True,
                                  error_messages={
                                        'max_length':'密码太长',
                                        'required':'密码不能为空'
                                    })

    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) # 字典类型
                return HttpResponse('successful done')
            else:
                print(obj.errors)  # 字典类型
                return render(request, 'login.html',{'obj':obj})

login.html模板中
    <form action="login.html" method="POST">
        {% csrf_token %}
        <p><input type="text" name="username" placeholder="用户名"> {{ obj.errors.username.0 }}</p>
        <p><input type="password" name="passwd" placeholder="密码"> {{ obj.errors.passwd.0 }}</p>
        <input type="submit" value="提交">
    </form>

要点:Form组件类中的字段名称要和相应的html模板文件的name属性值对应才可以检测成功 # html标签name属性 = Form类字段名
# 正确信息
obj.cleaned_data
# 所有错误信息
obj.errors
View Code

 

posted @ 2017-09-17 17:42  _慕  阅读(436)  评论(0编辑  收藏  举报
Title
返回顶部