day73---Django的MTV

1. 路由

http://www.cnblogs.com/yange/articles/8313296.html
  • 普通的URL映射

    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^index/$', views.index),
    ]
    #
    def index(request):
    pass
  • 正则表达式

    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^index/(\d+)/$', views.index),
    ]
    #
    def index(request, id):
        pass
  • 分组命名

    • name的普通模式
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^index/1/2/3/4/5/6/$', views.index, name=n1),
    ]
    # 
    from django.urls import reverse
    def index(request):
        print(reverse(n1))
    >>>
    /index/1/2/3/4/5/6/
    
    • name的按位置传参模式
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^index/1/2/3/4/5/6/(\d+)/$', views.index, name=n2),
    ]
    # 
    from django.urls import reverse
    def index(request, n2):
        print(reverse(n2), args=(10,))
        print(reverse(n2), args=(20,))
    >>>
    /index/1/2/3/4/5/6/10/
    /index/1/2/3/4/5/6/20/
    
    • name的按关键字传参模式
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^index/1/2/3/4/5/6/(?P<id>\d+)/$', views.index, name=n3),
    ]
    # 
    from django.urls import reverse
    def index(request, n3):
        print(reverse(n3), kwargs={'id':100})
        print(reverse(n3), kwargs={'id':200})
    >>>
    /index/1/2/3/4/5/6/100/
    /index/1/2/3/4/5/6/200/
    
  • 路由分发

    from django.conf.urls import url, include
    urlpatterns = [
        url(r'index/$', include('index.urls'))
        url(r'home/$', include('home.urls'))
    ]
  • 命名空间

    from django.conf.urls import url, include
    urlpatterns = [
        url(r'index/$', include('index.urls', namespace='index')),
        url(r'home/$', include('home.urls', namespace='home')),
    ]

2. 视图

http://www.cnblogs.com/yange/articles/8313301.html#_label0
  • 请求相关(request)

    • POST
    • GET
    • Meta
    • mothed
    • body
    • session
    • ...
  • 业务逻辑

    • 功能代码
    • 模型调用
    • 参数调用
    • ...
  • 响应相关(response)

    • render
    • HttpResponse
    • redirect (只有相应头,没有响应体)
    • JsonResponse
    • ...

3. 模版

http://www.cnblogs.com/yange/articles/8313301.html#_label1
  • 注释

    {# 注释信息 #}
  • 变量 (索引下标/键值对/属性值/...)

    {{ 变量名 }}
  • 过滤器 (default/length/filesizeformat/date/slice/safe/...)

    {{ var|filter_name:param }}
  • 标签 (if/for/with/csrf_token/...)

    {% tag %}
        ...
    {% endtag%}
  • 母板 (继承/块/组件/静态文件/...)

    {% extends 'base.html' %}
    {% block block_name %}
        ...
    {% endblock %}
    {% include 'public.html' %}
    {% load STATIC_NAME %}
    <img src="{% STATIC_NAME"images/img.jpg"%}" alt=""/>
    #
    {% load STATIC_JS %}
    {% STATIC_JS "js/myjs.js" as MYJS %}
    <script src="{{ MYJS }}"></script>
    #
    #
    {% load STATIC_NAME %}
    <img src="{% get_static_prefix"images/img.jpg"%}" alt=""/>
    #
    {% load STATIC_NAME %}
    {% load get_static_prefix as STATIC_PRE %}
    <img src="{{ STATIC_PRE }}images/img1.jpg" alt=""/>
    <img src="{{ STATIC_PRE }}images/img2.jpg" alt=""/>
  • 自定义过滤器

    • 在已注册的app中创建一个名字叫templatetags文件夹
    • 任意创建一个py文件
    • 导入Library
    • 实例化register
    • 定义函数(加装饰器@register.filter@register.simple_tag)
    • 使用
    from django.template import Library
    register = Library()
    @register.filter
    def aaa(a1,a2):
        a3,a4 = a2.split(',')
        data = "我是%s,我有%s和%s" %(a1, a3, a4)
        return data
    @register.simple_tag
    def bbb(a1,a2,a3,a4):
        result = a1+a2+a3+a4
        return result
    @register.filter
    def ccc(a1):
        if 'yy' in a1:
            return True
        return False

4. cookie和session

http://www.cnblogs.com/yange/articles/8359446.html

5. 中间件

  • 概念:Django的中间件是一个类

    • 继承MiddlewareMixin基类
    • 请求方法:process_request
      • 如果请求有返回值,则执行自己的response和以上的response
      • 如果没有返回值,则继续往下运行
    • 相应方法:process_response,必须设置返回值
  • 定义:针对所有请求做统一操作时,使用中间件来管理,如果对少量的视图做操作时,可以使用装饰器

  • 应用案例:

    • 记录请求访问的日志
    • 登录验证操作
    • 权限验证
  • 使用中间件实现登录验证功能

    • 创建对应的py文件
        创建文件:app01/middleware/auth.py
    
    • 配置setting.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',
            'app01.middleware.auth.AuthMiddleware',
        ]
    
    • 配置路由
        from django.conf.urls import url
        from app01 import views
        urlpatterns = [
            url(r'^login/$', views.login),
            url(r'^index/$', views.index),
            url(r'^home/$', views.home),
        ]
    
    • 配置视图
        from django.shortcuts import render, HttpResponse, redirect
        def login(request):
            if request.method == 'POST':
                user = request.POST.get('user')
                pwd = request.POST.get('pwd')
                if user == 'aaa' and pwd == '123':
                    request.session['user_info'] = {'id': 1, 'url': 'home'}
                    return redirect('/home/')
            return render(request, 'login.html')
        def index(request):
            return HttpResponse('首页')
        def home(request):
            return HttpResponse('个人页面')
    
    • 配置模版
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <title>登录页面</title>
        </head>
        <body>
        <form action="" method="post">
            {% csrf_token %}
            <p>
                <label for="">
                    用户名:
                    <input type="text" name="user">
                </label>
            </p>
            <p>
                <label for="">
                    密码:
                    <input type="password" name="pwd">
                </label>
            </p>
            <p><input type="submit" value="提交"></p>
        </form>
        </body>
        </html>
    
    • 配置中间件
        from django.utils.deprecation import MiddlewareMixin
        from django.shortcuts import redirect
        class AuthMiddleware(MiddlewareMixin):
            def process_request(self, request):
                # 访问登录页面和首页时不需要做验证,直接return None继续往下执行
                if request.path_info == '/login/' or request.path_info == '/index/':
                    return None
                # 获取session,登录成功之后才能跳转到个人页面,否则继续留在登录页面
                user_info = request.session.get('user_info')
                if not user_info:
                    return redirect('/login/')
            def process_response(self, request, response):
                return response
    
posted @ 2018-02-14 13:42  _岩哥  阅读(108)  评论(0)    收藏  举报