django上课笔记6

Posted _慕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django上课笔记6相关的知识,希望对你有一定的参考价值。

一、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

 


以上是关于django上课笔记6的主要内容,如果未能解决你的问题,请参考以下文章

Django项目笔记——聊天功能的实现

django上课笔记1

Django项目笔记——联机对战的实现

django上课笔记2

django上课笔记4

django上课笔记7