Django路由层相关知识

昨日内容回顾

  • Django请求生命周期图

    处理一条请求与7个部分关联:

    客户端、网关服务接口、Django中间件、路由层、视图层、模板层、模型层。

  • Django路由层的匹配

    • 静态匹配

      匹配指定的路由。

    • 动态匹配

      分为转换器匹配和正则匹配。正则匹配又包含有名分组匹配与无名分组匹配。

    • 反向解析

      在HTML页面或后端界面进行动态匹配时,需要用到反向解析。

今日内容概要

  • 路由分发
  • 名称空间
  • 虚拟环境
  • request获取文件对象
  • 路由层返回数据要求
  • FBV与CBV
  • CBV原理解析
  • 模板层传值

今日内容详细

路由分发

路由分发的基础是Django允许每个app拥有自己独立的一套配置数据,包括路由、模板、视图等。当一个Django项目内含有多个app且每个app下有多个视图时,为了方便管理,在项目根目录下的路由层中,不会直接匹配请求的视图,而是将请求的视图分配给其所在的app,由其所在的app进行后续的操作,这就是路由分发。

路由分发的表现形式

项目根目录下路由中的路由匹配:
path('app_name/', include('app_name.urls')) # 使用include需要导入

名称空间

Django项目中的所有视图共享一个名称空间,当为不同项目下的视图指定相同的name时,仅有后被加载的视图可以生效,先加载的视图的名称会被覆盖。

为避免名称的覆盖问题,最简单的解决方式是指定名称时为视图添加当前app的前缀来区分,也可以在路由分发时指定视图所在的名称空间。

总路由
path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
反向解析
reverse('app01:index_view')
reverse('app02:index_view')

虚拟环境

虚拟环境是已存在的程序运行环境的备份,虚拟环境是为了特定程序运行单独开设的,目的是为了保证程序运行环境的纯净,以节省空间。

创建虚拟环境的方法:

  1. 使用pycharm创建,操作较为简单,在创建新项目时选择虚拟环境即可;
  2. 命令行创建,指令为 python -m venv python_venv,最后一个单词为虚拟名称名字,可自定义。命令行创建虚拟环境需要手动启动activate文件以激活虚拟环境,使用deactivate文件关闭虚拟环境。

request获取文件对象

Django后端获取文件对象使用request. FILES。

使用该方法能获取到文件对象的前提是前端form表单使用了正确的提交方式。form表单中关于文件传输需要满足两个条件:

  1. method必须为post
  2. enctype必须为multipart/form-data

路由层返回数据要求

用来处理请求的视图函数返回的数据必须为HttpResponse对象。

视图函数返回数据有三种,为HttpResponse()、render()、redirect(),其本质都是返回了HttpResponse对象。

class HttpResponse:
    pass
return HttpResponse()	

def render():
    return HttpResponse()
return render()

def redirect():
    redirect_class = 类(祖先有个类是HttpResponse)
    return redirect_class()
return redirect()

FBV与CBV

FBV即以函数为基础的视图,即视图中实现功能主要通过功能函数。

CBV即以类为基础的视图,即视图中实现功能主要通过类的操作。本质也是通过类中定义的功能函数实现,不过可以通过定义特定的函数实现自动实现请求种类对应的操作。

CBV原理解析

定义相关视图类形式,可以看到继承了views中的View类:

class MyLoginView(views.View):

CBV路由匹配形式,需要调用类中的as_view函数:

path('login/', views.MyLoginView.as_view())

父类View的代码主体:

class View:
     @classmethod
     def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            return self.dispatch(request, *args, **kwargs)
        return view
     def dispatch(self, request, *args, **kwargs):
         handler = getattr(self, request.method.lower())
         return handler(request, *args, **kwargs)

调用相关视图类的执行流程:

  1. 首先执行as_view函数,将views.MyLoginView.as_view()变换为views. view;
  2. 执行view函数,生成自定义类的对象,让后调用dispatch函数(需要注意查找顺序);
  3. 调用dispatch函数,获取request中的请求方式并转换为小写;
  4. 调用自定义类中的请求对应方式小写对应的函数。

模板层传值

Django模板语法主要格式:

"""
{{ }}    数据相关操作
{% %}    逻辑处理相关操作,调用函数时只需要写函数名
{# #}     注释语法,不会显示在前端页面上
"""

模板语法传值方式

  1. 使用字典形式传值,传值精准,值较多时不适用。
return render(request, 'html_name.html', {'name1': data1, 'name2': data2})
  1. 使用locals()传值,将该函数中所有名称及对应值传入,值多时适用。
return render(request,'html_name.html', locals())

模板语法传值特性

  1. python基本数据类型正常展示;
  2. 文件对象也可以展示并调用方法;
  3. 函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参);
  4. 类名也会自动加括号调用,对象直接展示;
  5. 使用{{ 数据|内置方法名}}可以调用数据内置函数。
posted @ 2022-12-13 22:14  Akazukis  阅读(36)  评论(0)    收藏  举报