标签:views url request 别名 django 学习 路由
django学习(三)
昨日回顾
django三板斧
HttpResponse:主要返回文本
render:返回html页面和字典数据
redirect:重定向网址
静态文件配置
是什么:前端需要的不会被经常修改的文件,css文件、js文件、img文件、第三方框架文件
放在哪:static文件夹,默认都是叫这个名字
怎么用:STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')],之后访问地址带上设定的前缀就可以访问到了
区别呢:接口前缀与静态文件夹,一个是获得访问静态文件的钥匙,一个是告诉那几扇门里面拥有静态文件
动态呢:{% load static %}, href={% static 'a.txt' %}
request对象方法
request.method:获取当前请求方式:GET或者POST
request.POST:获取post请求提交的普通数据(不包含文件)
request.POST:看成是一个字典
request.POST.get():获取值列表最后一个元素
request.POST.getlist():获取整个值列表
request.GET:获取url问号后面携带的数据
request.GET:看成是一个字典
request.GET.get():获取值列表最后一个元素
request.GET.getlist():获取整个值列表
orm相关操作
概念:关系映射,我的一串py代码,可以代表着数据库中的一串SQL语句
关系:类 = 表,对象 = 记录, 属性 = 字段
放在哪:models.py,模型层(专门用于数据库层面交互)
代码:
class UserInfo(models.Model): # 创建类就是创建表
uid = models.AutoField(primary_key=True) # 表的主键字段,自增
name = models.CharField(max_length=32) # 设置字段
迁移:
python3 manage.py makemigrations # 记录
python3 manage.py migrate # 迁移
# 只要修改了models.py中与数据库相关的代码 那么都需要重新执行迁移
数据增删改查:
from app01 import models
# 查
models.UserInfo.objects.filter()
结果可以看成是列表套一个个数据对象
# 增
models.UserInfo.objects.create(name='jason')
返回值就是当前被创建的数据对象本身
# 改
models.UserInfo.objects.filter().update(name='jasonNB')
# 删
models.UserInfo.objects.filter().delete()
今日学习内容
django请求生命周期流程图
graph TB 由客户端往下到数据库然后返回到客户端 客户端-.解析数据并封装.->web服务网关接口-->django后端-->中间件-->路由层-->视图层-->模板层 -->数据库-->模板层-->视图层-->中间件-->django后端-->web服务网关接口-.打包数据并发送.->客户端
路由层之路由匹配
特点:进行后缀匹配,只要匹配成功就会执行对应的视图函数
这个匹配,我们其实学过,就是大名鼎鼎的正则表达式
url(r'^后缀$',views.函数)
^表示以该内容开头,$结尾表示是以前面的内容结尾
斜杠确认机制:
比如说正则为test/,而内容为test;首次匹配不上,djang就会将内容尾部追加上/再次进行确认
APPEND_SLASH = False 可以取消斜杠确认机制,但是没必要
定制主页面和尾页:
url(r'^$',views.home) # 主页面,重要
url(r'.*',views.error) # 尾页,任意
无名有名分组
正则表达式之无名分组:
url(r'^test/\d+/$', views.test) # 未分组
url(r'^test/(\d+)/$', views.test) # 分组后
那么视图函数下,需要多创建一个位置参数:
def text(request,位置参数名):
return 三板斧
在未分组的情况下,路由匹配成功的数据,会默认传递给request位置参数中
而在分组的情况下,路由匹配成功的数据,会再次将该数据当做一个位置参数,并且传递到request参数的后面
正则表达式之有名分组:
url(r'^test/(\d+)/$', views.test) # 无名分组后
url(r'^test/(?P<名字>\d+)/$', views.test) # 有名分组后
那么视图函数下,需要多创建一个位置参数:
def text(request,名字):
return 三板斧
在未命名的情况下,任意名字的位置参数都可以去接受到正则表达式匹配成功并无名分组的数据
而在命名的情况下,必须使用对应的名字的关键字参数去接受才能获取到通过正则表达式匹配成功的数据
注:有名参数和无名参数不可以混合使用。
反向解析
在路由地址匹配出现了变化的时候,使用了该路由地址的页面就会失效
就比如说,
页面上的有很多a标签
a标签的href可以写了网址的全称或者写后缀
href='https://www.baidu.com'
href='/login/' # 自动补全当前服务的ip和port
href='127.0.0.1:8000/login/'
而url(r'^/login/', views.功能函数)变成了(r'^/随便什么/', views.功能函数)
html的herf标签指向的对应关系全部失效。
反向解析就类似于将对应关系起了一个别名,使用别名之后,就可以动态获取到对应关系了
步骤1:给对应关系起别名
url(r'^func/',views.func,name='别名')
步骤2:使用反向解析获取结果
前端:
{% url '别名' %} # 前端固定写法,结果可以访问路由
后端:
from django.shortcuts import reverse # 导入该模块,后端就可以通过别名动态拿到目标
reverse('别名') # 结果可以访问路由
无名分组反向解析
步骤1:给队友关系起别名
url(r'^func/(\d+)/',views.func,name='别名')
步骤2:使用反向解析获取结果
正则表达式所能指代的内容是在太多了,将这个对应关系重起别名之后,就会出现别名的反向解析结果是在可以有太多种了,使用对象无法按照别名获取到明确的对应关系。
所以针对无法冲别名获得明确的对应关系的时候,需要人为指定
前端:
{% url '别名' 明确的内容 %} # 因为正则表达式规定是数字,那么明确内容中只能匹配数字
# 别名/明确的内容
后端:
from django.shortcuts import reverse # 导入该模块,后端就可以通过别名动态拿到目标
reverse('别名', args = (明确的内容)) # 别名/明确的内容
而对应关系中需要用*args,**kwargs来确保能接收到所有参数
def func(request, *args, **kwargs)
return 三板斧
有名分组反向解析
和无名基本一样,不明确的内容需要人为指定好
步骤1:给对应关系起别名
url(r'^func/(?P<id>\d+)/',views.func,name='别名')
步骤2:使用反向解析获取结果
前端:
{% url '别名' 明确的值 %}
{% url '别名' id=明确的值 %}
后端:
from django.shortcuts import reverse
reverse('func_view',args=(明确的内容,))
reverse('func_view',kwargs={'id':明确的内容})
无名有名的反向解析中的手动传值,这个值在工作中可以是: 数据的主键值、页面的页码、区域的编号等
路由分发
根据应用的不同拆分到不同的应用中
django支持每个应用都可以有自己独立的
路由层、模板层、静态文件、视图层(默认)、模型层(默认)
上述特性能够让django在分组开发上更加的方便、快捷
所有人都可以在应用中开发完整的项目功能
最后汇总到一个空的django项目中 然后通过路由分发整合所有人的应用
1.创建多个应用 并去配置文件中注册
INSTALLED_APPS = [
'app01',
'app02'
]
2.在多个应用中编写相同的路由
urlpatterns = [
url(r'^index/',views.index111)
]
urlpatterns = [
url(r'^index/',views.index)
]
3.路由分发
总路由
from django.conf.urls import url, include
from app01 import urls as app01_urls
from app02 import urls as app02_urls
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
"""总路由只负责分发 不负责视图函数对应"""
上述代码还可以简写
from django.conf.urls import url, include
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
该功能主要是为了好管理,将路由地址放在自己的app中,总路由就可以对分路由做一个管理和分发。
标签:views,url,request,别名,django,学习,路由 来源: https://www.cnblogs.com/easonqu/p/16265102.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。