视图与模板,中间件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Feng_xiaowu/article/details/102731535

视图

类视图(CBV)

  • 函数视图(FBV)

  • 作用:可以将视图对应的不同请求方式以类中的不同的方法来区别定义

class Index(View):
    def get(self, request, *args, **kwargs):
        name = request.GET.get('name')
        age = request.GET.get('age')
        print(name, age)
        return HttpResponse(name+age)

    def post(self, request, *args, **kwargs):
        name = request.POST.get('name')
        age = request.POST.get('age')
        print(name, age)
        return HttpResponse('post')
  • 类视图的好处:
    • 代码可读性好
    • 类视图相对于函数视图有更高的复用性,若其他地方需要使用该视图,直接继承即可

类视图装饰器

  • 在类中使用装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图的装饰器
  • method_decorator装饰器使用name参数指明被装饰的方法
# 定义装饰器模板
def outer(func):
    def inner(request, *args, **kwargs):
        # request.Response('我是一个装饰器')
        print(request.method)
        func(request, *args, **kwargs)
        return inner
    return outer


#给全部请求方法添加装饰器
@method_decorator(outer,name='dispatch')
class Decorator(View):
    
     def dispatch(self, request, *args, **kwargs):
         # 使用super来进行继承
         # super语法 :super().父类名()
         return super().dispatch(request, *args, **kwargs)

     def get(self, request):
         return HttpResponse('get method')
    
     def post(self, request):
         return HttpResponse('post method')
    
    

    
# 为特定请求方法添加装饰器
@method_decorator(outer, name='get')
class Decorator(View):
    
     def dispatch(self, request, *args, **kwargs):
         # 使用super来进行继承
         # super语法 :super().父类名()
         return super().dispatch(request, *args, **kwargs)

     def get(self, request):
         return HttpResponse('get method')

     def post(self, request):
         return HttpResponse('post method')
        

如果需要给类视图的多个方法添加装饰器,但又不是所有的都添加,则可以直接在需要添加装饰器的方法上使用method_decorate(装饰器名称)即可



class Decorator(View):
    
     def dispatch(self, request, *args, **kwargs):
         # 使用super来进行继承
         # super语法 :super().父类名()
         return super().dispatch(request, *args, **kwargs)
    
     @method_decorate(outer)
     def get(self, request):
         return HttpResponse('get method')

     @method_decorator(outer)
     def post(self, request):
         return HttpResponse('post method')

中间件

  • 在请求视图被处理前,中间件由上往下依次执行

  • 在请求视图被处理后,中间件由下至上依次执行

在这里插入图片描述

示例:

定义两个中间件

def my_middleware(get_response):
    print('init 被调用')
    def middleware(request):
        print('before request 被调用')
        response = get_response(request)
        print('after response 被调用')
        return response
    return middleware

def my_middleware2(get_response):
    print('init2 被调用')
    def middleware(request):
        print('before request 2 被调用')
        response = get_response(request)
        print('after response 2 被调用')
        return response
    return middleware

注册添加两个中间件

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',
    'users.middleware.my_middleware',  # 添加
    'users.middleware.my_middleware2',  # 添加
]

执行结果

init2 被调用
init 被调用
before request 被调用
before request 2 被调用
view 视图被调用
after response 2 被调用
after response 被调用

模板

模板语句

1)for循环:

{% for item in 列表 %}

循环逻辑
{{forloop.counter}}表示当前是第几次循环,从1开始
{%empty%} 列表为空或不存在时执行此逻辑

{% endfor %}

2)if条件:

{% if ... %}
逻辑1
{% elif ... %}
逻辑2
{% else %}
逻辑3
{% endif %}

比较运算符如下:

==
!=
<
>
<=
>=

布尔运算符如下:

and
or
not

注意:运算符左右两侧不能紧挨变量或常量,必须有空格。

{% if a == 1 %}  # 正确
{% if a==1 %}  # 错误

自定义过滤器

  • 在需要使用自定义过滤器的子应用中创建一个**templatetags**的包(包名固定),并创建一个.py文件,文件名随意

  • 在文件中,输入以下命令

    from django import template
    
    # 实例化注册对象
    register = template.Library()
    
    #使用装饰器自定义过滤器
    @register.filter
    # x表示要过滤参数
    def add(x):
        return x+100
    
    
  • 在要使用的HTML文件中使用**{% load .py文件名 %}**导入过滤器

  • 注意-------templatetags文件夹需要在各自的子应用内创建

模板继承

  • 目的-------提高代码复用性,减轻工作量

    {% block 名称 %}
    预留区域,可以编写默认内容,也可以没有默认内容
    {% endblock  名称 %}
    
    
    
    {% extends "父模板路径"%}
    
    
    {% block 名称 %}
    实际填充内容
    {{ block.super }}用于获取父模板中block的内容
    {% endblock 名称 %}
    
  • 注释:

  -单行注释
    {#...#}

  - 多行注释使用comment标签


    {% comment %}
   		 ...
    {% endcomment %}
 

    ​

猜你喜欢

转载自blog.csdn.net/Feng_xiaowu/article/details/102731535
今日推荐