可视化界面之数据增删改查、django请求生命周期图、django路由层、反向解析

  • 可视化界面之数据增删改查

  • django请求生命周期流程图

  • django路由层

  • 反向解析

  • 路由分发

  • 名称空间

  • 虚拟环境

可视化界面之数据增删改查

  • 建表

建表、加索引可以体现程序员的工作经验。
建表之前需要考虑,极端情况下 这个字段最多能存多少数据?
字段长度短了会导致服务出问题,字段长度长了会占用空间,浪费资源

在model.py使用ORM建表时,可以在类中不写主键字段(id),
django会自动帮你创建一个名为id的主键字段。

可以在models.py中给字段添加注释 比如age字段 可以通过另外的方式查看字段的意义

image

方式1:在mysql中用show create table表名可以查看注释
方式2:mysql中有缓存表可以查看
  • 数据展示功能

开设接口、获取数据、传递页面、展示数据

数据展示页面示例

image

数据展示页表格html

image

针对数据对象主键字段的获取可以使用更加方便的obj.pk获取

image

数据展示views.py

image

  • 数据添加功能

开设接口、获取数据、发送数据、校验数据、录入数据、重定向

我们点击a标签按钮,跳转到数据添加页面,进行添加数据。
a标签相当于朝你指定的页面发送get请求:

image

数据添加页表单

image

数据添加views.py

image

  • 数据编辑功能

开设接口、后端如何区分所要编辑的数据(问号携带参数)、后端获取用户数据、前端展示默认数据、获取用户并完成更新

编辑用户信息的时候 如何让新页面知道 你想编辑的是哪个用户?
a标签默认发送get请求 我们可以使用get请求携带一些信息。
携带主键值:

image

示例:

image

数据编辑views:

使用request.GET.get获取get请求问号后面携带的主键值

image

userEditPage.html:将后端通过id值查到的数据 塞到数据添加页面表单的默认值(value)里面去!

image

views.py编辑用户数据的相关逻辑

image

  • 数据删除功能

开设接口、问号携带参数、删除二次确认

扩展1:在数据表中新建一个枚举字段,用于表示数据是否被删除,如果删除则将此字段变为false。数据展示的时候不展示false的数据。
扩展2:删除的时候可以在前端写一个模态框进行二次确认

用get请求给后端传递主键值,告知数据库到底要删除哪个数据

image

在views层接收主键值、调用数据库执行删除操作

image

添加模态框。给a标签添加类名,注意这里因为在循环中,所以不能添加id属性

image

当模态框获取用户输入的结果是false时,使用return false取消a标签的默认事件:

image

Django请求生命周期流程图

学习流程
	路由层、视图层、模板层、模型层、组件、BBS项目

image

django路由层

  • 路由匹配

django2.X及以上 path第一个参数些什么就匹配什么
django1.x第一个参数是正则表达式
无论什么版本django都会自带加斜杠后缀的功能 也可以取消
也就是说:django会帮你加斜杠重新给你从上到下匹配一次 一共匹配两次

image

第一次请求匹配失败

image

image

配置文件中设置APPEND_SLASH = False可以取消这个特性但是建议不要这么做:

image

  • 转换器功能 path

正常情况下很多网站都会有很多相似的网址 如果我们每个都单独开设路由不合理

用django设置路由 这路由太多了不太合适

我们不可能一个接口一个接口的写 相似的接口要整合到一起

django2.X及以上版本路由动态匹配有转换器(五种)
      str:匹配除路径分隔符外的任何非空字符串
      int:匹配0或者任意整数
      slug:匹配任意一个由字母或数字组成的字符串
      uuid:匹配格式化后的UUID
      path:能够匹配完整的URL路径
ps:还支持自定义转换器(自己写正则表达式匹配更加细化的内容)

路由不是写死的 而是动态变化的 django提供相应的功能--> 转换器

转换器 : 将对应位置匹配到的数据转换成固定的数据类型

image

path('index/<str:info>/', views.index_func),  # index_func(实参request对象,info='转换器匹配到的类型转换之后的内容')

path('index/<str:info>/<int:id>/', views.index_func)  # index_func(实参request对象,info='转换器匹配到的类型转换之后的内容',id='转换器匹配到的类型转换之后的内容')

转化器的info会当做位置参数传给视图函数:

image

在views层接收传来的info:

image

  • 正则匹配

django2.X及以上版本有re_path 第一个参数是正则
匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到数据就算匹配成功会立刻停止路由层其他的匹配直接执行对应的视图函数
示例:re_path('^test/$', views.test)
举例说明:
对于如下re_path,只要目标字符串中 有test/就能匹配成功

image

django1.X路由匹配使用的是url() 功能与django2.X及以上的re_path()一致。
django1.x首页的路由应该这样写:

image

  • 正则匹配的无名和有名分组

无名分组

无需给匹配条件取名字。
re_path('^test/(\d{4})/', views.test)
会将括号内正则匹配到的内容当做位置参数传递给视图函数(一个括号对应一个位置实参)
接受时候的形参无所谓,可以自己取名

有名分组

re_path('^test/(?P<year>\d{4})/', views.test)

会将括号内正则匹配到的内容当做关键字参数传递给视图函数
 	注意上述的分组不能混合使用!!!
    不能同一个路由 既使用无名分组 又使用有名分组

反向解析

为什么要有反向解析?
当项目特别庞大 很多页面 都写了a标签进行跳转 a标签都指向同一个路由:

image

如果我们换路由 会将之前所有a标签全部失效!
总不能手动一个个换吧。所以要使用反向解析。
基本使用
通过一个名字可以反向解析出一个结果 该结果可以访问到某个对应的路由

路由匹配关系起别名

path('login/', views.login, name='login_view')

image

反向解析语法

html页面上模板语法     {% url 'login_view' %}
后端语法              reverse('login_view')

使用模板语法,当路由改变时,a标签能通过名字login_name找到这个名字对应的路由,也动态的进行改变:

image

后端使用reverse反向解析:

image

动态路由的反向解析

path('func1/<str:others>/', views.func1_func, name='func1_view')

    html页面上模板语法       {% url 'func1_view' 'jason' %}
    后端语法                reverse('func1_view', args=('嘿嘿嘿',))

动态路由的情况下正常情况是无法解析的,因为构成这个路由的结果可能有,无数个。
要把动态的部分确定下来,必须得传一个具体的值(这个值可以对象点name 传数据的主键值):

image

如果有两个动态的参数,就传两个,用空格隔开。
后端语法:

image

通过args传位置参数,将动态的部分确定下来

路由分发

'''
当一个django项目特别大,里面有很多应用,每个应用下有很多对应关系
   那么django自己带的路由层里面的代码就会非常多,那么我们怎么优化?
       >>>:根据应用的不同拆分不同的应用中
   Django支持每个应用都可以有自己独立的路由层、模板层、静态文件、视图层(默认)、模型层(默认)
   也就是所有人都可以在应用中开发完整的项目功能
         最后汇总到一个空的django项目中 然后通过路由分发整合所有人的应用
'''

1.创建多个应用,并配置文件中注册
# 创建多个应用 并去配置文件中注册
INSTALLED_APPS = [
    'app01',
    'app02'
]

2.去app中创建urls.py
from django.urls import path
from app01 import views

urlpatterns = [
    path('index/', views.index)
]

3.路由分发
     总路由层面
     # 路由分发
    path('app01/', include('app01.urls')),
    path('app02/', include('app02.urls'))
     """总路由只负责分发 不负责视图函数对应"""
     
使用路由分发之前 总路由自己干与视图函数的匹配
使用路由分发之后 总路由只按照应用名分配匹配方向

image

名称空间

路由分发之后 针对相同的别名能否自动反向解析除不同的应用前缀
     默认情况下是无法直接识别应用前缀的

image

如果想要正常识别区分有两种方式
    方式1:名称空间
       总路由添加名称空间
    path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
    path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
       反向解析
       reverse('app01:index_view')
       reverse('app02:index_view')
        
    方式2:只需要确保反向解析的别名在整个项目中不重复就可以
       多个应用别名不冲突可以
    path('index/', views.index, name='app01_index_view')
    path('index/', views.index, name='app02_index_view')

虚拟环境

# 我们在实际开发工作中,会针对不同的项目需要为其配备对应的解释器环境
eg:
    项目1
      django2.2 python38
    项目2
      django3.2 pymysql requests python38
    项目3
      django1.1 request_html flask urllib3
实际开发项目中我们只会给项目配备所需的环境,不需要的一概不配!!!

# 怎么样确保都能正常运行
   方式1:把所有需要用到的模块全部下载下来 如果有相同模块不同版本每次都重新下载替换
   方式2:提前准备好多个解释器环境 针对不同的项目切换即可
    
# 虚拟环境
能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境

# 创建虚拟环境
pycharm创建虚拟环境:(每创建一个虚拟环境就相当于重新下载了一个全新的解释器)
命令行的方式: python -m venv pyvenv38
 
注意:python命令此处不支持多版本共存的操作 python27 python36 python38
    激活
        activate
    关闭
        deactivate

pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com

image

posted @ 2022-12-12 23:27  Super小赵  阅读(46)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************