模板 类视图和中间件

模板和类视图

1. 在工程中创建模板目录templates。

然后修改settings.py配置文件中修改TEMPLATES配置项的DIRS值, 如下:

image

2. 定义模板

在templates新建一个index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ city }}
</body>
</html>

3. 类视图的引入

在Django中也可以使用类来定义一个视图,称为类视图

 def register(request):
    """处理注册"""

    # 获取请求方法,判断是GET/POST请求
    if request.method == 'GET':
        # 处理GET请求,返回注册页面
        return render(request, 'index.html')
    else:
        # 处理POST请求,实现注册逻辑
        return HttpResponse('这里实现注册逻辑')

使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。如下所示

from django.views.generic import View

class RegisterView(View):
    """类视图:处理注册"""

    def get(self, request):
        """处理GET请求,返回注册页面"""
        return render(request, 'register.html')

    def post(self, request):
        """处理POST请求,实现注册逻辑"""
        return HttpResponse('这里实现注册逻辑')

类视图的好处:

  • 代码可读性好
  • 类视图相对于函数视图有更高的复用性, 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可

4. 类视图的使用

定义类视图需要继承自Django提供的父类View,可使用from django.views.generic import View或者from django.views.generic.base import View 导入,定义方式如上所示。

from django.views.generic import View
class RegisterView(View):
    """类视图:处理注册"""
    def get(self, request):
        """处理GET请求,返回注册页面"""
        return render(request, 'register.html')

    def post(self, request):
        return render(request, 'index.html')

配置路由时,使用类视图的as_view()方法来添加

urlpatterns = [
    # 视图函数:注册
    # url(r'^register/$', views.register, name='register'),
    # 类视图:注册
    url(r'^register/$', views.RegisterView.as_view(), name='register'),
]

5. 类视图原理

 @classonlymethod
    def as_view(cls, **initkwargs):
        """
        Main entry point for a request-response process.
        """
        ...省略代码...

        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.request = request
            self.args = args
            self.kwargs = kwargs
            # 调用dispatch方法,按照不同请求方式调用不同请求方法
            return self.dispatch(request, *args, **kwargs)

        ...省略代码...

        # 返回真正的函数视图
        return view


    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

总结:

URL里面调用as_view,调用dispatch方法,按照不同请求方式调用不同请求方法。最后返回真正的函数视图View

6. 定义模板,模板渲染

1. 在templates目录中新建一个模板文件,如test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <h1>{{ city }}</h1>
</body>
</html>

2. 调用模板分为两步骤

1) 找到模板 loader.get_template(模板文件在模板目录中的相对路径) -> 返回模板对象

2) 渲染模板 模板对象.render(context=None, request=None) -> 返回渲染后的html文本字符串 context 为模板变量字典,默认值为None request 为请求对象,默认值为None

定义一个视图如下:

from django.http import HttpResponse
from django.template import loader
def test(request):
    # 1.获取模板
    template = loader.get_template('test.html')
    context = {'city': '北京'}
    # 2.渲染模板
    return HttpResponse(template.render(context))

返回:

image

上面代码可以简化,djangi提供了render函数

render(request对象, 模板文件路径, 模板数据字典)

from django.http import HttpResponse
from django.template import loader
# def test(request):
#     # 1.获取模板
#     template = loader.get_template('test.html')
#     context = {'city': '北京'}
#     # 2.渲染模板
#     return HttpResponse(template.render(context))
from django.shortcuts import render
def test(request):
    context = {'city': '广州'}
    return render(request, 'index.html', context)

猜你喜欢

转载自www.cnblogs.com/py-web/p/10905654.html