django之路由分组,反向解析,有名,无名分组
路由层
无名分组
有名分组
反向解析
路由分发
名称空间
伪静态的概念
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'test',views.test),
url(r'testadd',views.testadd),
]
路由一旦匹配就不再走下面的路由匹配关系了
路由增加首页的方式
url(r'^$',views.home)
路由增加尾页的方式(当所有的路径都匹配不上时,给我返回404提示信息)
url(r'',views.error) 切记必须加在最后
无名分组
url(r'^test/([0-9]{4})/', views.test),
会将加了括号的正则表达式匹配的内容当做位置参数传递给后面的视图函数
具体操作如下:



有名分组
url(r'^test/(?P<year>\d+)/',views.test)
会将加了括号的正则表达式匹配的内容当做关键字参数传递给后面的视图函数
关键字就是你尖括号里面的名字(year)
具体操作如下:



有名分组和无名不能混合使用!!!
只要不混着用,有名分组和无名分组支持多个相同类型的传参
反向解析:
试想一个场景,你有200多个a标签,href都指向index/,有一天在urls里面index改为了new_index,那么你只能手动改变a标签中的href,当你改完,又变成了my_index,那么一天的时间都可能在改地址,那么有没有什么方法,不再把程序写死,反向解析就是应用于此。
通过名字反向推导出页面文件,类似于字典
前端反向解析
{% url 'add' %} # {% url '放urls.py中路由与视图函数的name的值' %}


后端反向解析
url(r'^testadd123/$',views.testadd,name='add')

相对于前面的绑定关系,只要通过name的值就能找到前面的路径
from django.shortcuts import reverse
res = reverse('add')
print(res)


无名分组的反向解析
前端反向解析
{% url 'add' 1 %} # {% url '放urls.py中路由与视图函数的name的值' %}

后端反向解析
url(r'^testadd123/(\d+)/$',views.testadd,name='add')

from django.shortcuts import reverse
res = reverse('add',args=(1,))

有名分组的反向解析
前端反向解析
{% url 'add' 1 %} # {% url '放urls.py中路由与视图函数的name的值' %} 推荐你用这种
<a href="{% url 'add' year=1 %}">999</a>
后端反向解析
res = reverse('add',args=(1,)) # 推荐你用这种
res = reverse('add',kwargs={'year':1})
小口诀
url = r'^反向/无名(有名)',view.'(传无名)',name=('反向')
def xxx (request 无名)
reverse('反向',args(无名,))
render(request,'.html',{'无名':无名})
前端
href={%url '反向' 无名%}
推导:
url(r'^edit/(\d+)/',views.edit,name='edit_user')
{%for user_obj in queryset %}
edit/?id={{user_obj.pk}}
edit/?id={{user_obj.pk}}
edit/?id={{user_obj.pk}} {%for user_obj in queryset %}
edit/{{user_obj.pk}}/ >>> url(r'^edit/(\d+)/') def edit(request,edit_id) url = reverse('edit_user',args=(edit_id,))
edit/{{user_obj.pk}}/
edit/{{user_obj.pk}}/
edit/{{user_obj.pk}}/
路由分发(include):
总路由不再直接做路由与视图函数的对应关系,而是将获取的路由分发给下面的app去处理对应关系
每一个app下都可以新建自己的urls.py static文件夹 templates文件夹
项目总路由:
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
应用子路由:
app01.urls.py
from django.conf.urls import url
from app01 import views urlpatterns = [
url(r'^index/',views.index) ]
app02.urls.py
from django.conf.urls import url
from app02 import views urlpatterns = [
url(r'^index/',views.index) ]
如果两个app下起了相同的名字,那么反向解析不支持自动查找应用前缀
名称空间(了解即可):
# url(r'^app01/',include(app01_urls,namespace='app01')),
# url(r'^app02/',include(app02_urls,namespace='app02')) # print(reverse('app01:aaa'))
# print(reverse('app02:aaa'))
总结
总路由对子路由进行分发
from django.conf.urls import url,include
url(r'^app01/',include('app01.urls'))
url(r'^app02/',include('app02.urls'))
再在子路由app下创建urls
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index,name='app01_aaa')
] views
def index(request):
print(reverse('app02_aaa'))
return HttpResponse('.....')
伪静态
假装自己的路径是一个静态(数据写死的)文件的路径,其实你
是经过了视图函数处理,动态渲染页面
提高百度收藏你这个网页力度,当别人搜索你这个页面相关的内容
百度会优先展示你的页面(这样虽然能提高你网页被访问概率,但是还是干不过RMB玩家)
路由层结束了!!!
虚拟环境(演示一下虚拟环境,下载django2.0测试自定义转换器)
由来:
每个项目用到的模块不一样
目的:
为了让每一个项目都有仅仅属于自己的项目解释器
使用:
new project的时候选择虚拟环境创建项目
如果勾选了下面的make to all project你创建的虚拟环境就能够被其他新建的项目使用
django2.0与django1.0的区别(了解)
1.0里面的url对应django2.0里面re_path
django2.0里面的path第一个是精准匹配(你怎么写的,我就怎么匹配)
django1.0版本中匹配到的参数都是字符串类型
django2.0转换器(了解)
1.0版本的url和2.0版本的re_path分组出来的数据都是字符串类型
默认有五个转换器,感兴趣的自己可以课下去试一下
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
path('index/<str:id>/',index )
django2.0自定义转换器
需要三步走战略
# 自定义转换器
class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
register_converter(FourDigitYearConverter, 'yyyy') urlpatterns = [
path('admin/', admin.site.urls),
# path('index/<int:id>/',index ),
# path('index/<str:id>/',index ),
path('login/<yyyy:name>/',index) ]
视图层(views.py)
django必会三板斧
1.HttpResponse >>> 返回字符串
2.render >>> 支持模板语法,渲染页面,并返回给前端
3.redirect >>> 重定向(即可以重定向到别人的网址,也可以重定向到自己路由)
django返回的数据都是HttpResponse对象
JsonResponse(返回json格式的数据)
FBV与CBV
FBV:基于函数的视图
CBV:基于类的视图
from django.views import View
class Login(View):
def get(self,request):
# return HttpResponse('get')
return render(request,'login.html')
def post(self,request):
return HttpResponse('post')
查看as_view()源码

源码补充:
第一个疑问:
url(r'^login/',views.Login.as_view()) # >>>等价于 url(r'^login/',views.view)


第二个疑问:
为什么我get请求就走get方法,post请求就走post方法

文件上传
前端需要注意的地方
form表单method必须是post
enctype必须是multipart/form-data

后端需要注意的是
def upload(request):
if request.method == 'POST':
# print(request.FILES)
# print(type(request.FILES))
# print(request.FILES.get('myfile'))
# print(type(request.FILES.get('myfile')))
# 获取文件对象
file_obj = request.FILES.get('myfile')
# print(file_obj.name)
# 获取文件名
file_name = file_obj.name
# 文件读写操作
with open(file_name,'wb') as f:
# for line in file_obj:
for line in file_obj.chunks():
f.write(line)
return render(request,'upload.html')

request的八种属性:
request.GET
request.POST
request.method
request.body 原始数据
request.path # /upload/
request.get_full_path() # /upload/?id=1
request.META 网页原信息
request.FILES 文件
django之路由分组,反向解析,有名,无名分组的更多相关文章
- [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]
[Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
- Django之路由分发反向解析
Django路由分发|反向解析 当一个Django中有多个app时,路由会有很多,将这些路由都写在与项目同名的文件夹下就会显得很多,很乱.并且在协同开发的时候容易出现相同的命名,当项目合并后就会出现路 ...
- Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态
一.Django请求生命周期 二.路由层 urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...
- django路由匹配、反向解析、无名有名反向解析、路由分发、名称空间
目录 django请求生命周期流程图 1.Django请求的生命周期的含义 2.Django请求的生命周期图解及流程 3.Django的请求生命周期(分布解析) 路由层 1.路由匹配 2.path转换 ...
- django路由的反向解析
什么是路由的反向解析 我们的路由都是一个匹配关系,对应一个处理的视图函数, 如果我们的匹配关系发生了变化,那么与之对应的访问地址(可能前端直接url链接, 也可能是后端的redrict跳转)都需要跟着 ...
- Django框架(四)-- 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别、Django虚拟环境搭建
路由控制 一.简单路由配置 url(r'^booklist$', views.booklist) 第一个参数是正则表达式,第二个参数是视图函数 每个正则表达式前面的'r' 是可选的但是建议加上.它告诉 ...
- Django框架(四)—— 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别
目录 路由控制 一.简单路由配置 二.无名分组 三.有名分组 四.反向解析 五.路由分发 六.名称空间(一般不使用) 七.伪静态 八.Django 2.x和Django 1.x 路由层区别 九.APP ...
- Django 的路由层URL 分组 路由分发 反向解析
URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调 ...
随机推荐
- DedeCms织梦后台管理员密码修改和忘记重置方法
方法/步骤 打开dede_admin数据表: 进入你的MYSQL后台,然后在你的数据库名中,找到dede_admin这项如图,pwd下的值就是你的密码,织梦密码采取的是MD5加密,破解麻烦而且没有必要 ...
- 优秀的看图工具推荐 —— XnViewMP
XnViewMP是一款非常棒的完全免费图片浏览器,支持100多种图片格式,XnViewMP还具有浏览器.幻灯片.屏幕捕捉.缩略图制作.批处理转换.十六进制浏览.拖放.通讯录.扫描输入等功能.XnVie ...
- 对EJB的认识
对EJB的认识 接触EJB以来有一段时间了,走马观花一样把它所涉及到的东西看了一遍,随着深入了解越来越感觉到ejb的很强大,用了java后觉的java好用.学历SSH觉的比java好用.学了ejb觉的 ...
- CodeIgniter框架学习要点
以下内容从兄弟连的CI教学视频中摘抄: http://codeigniter.org.cn/tutorials/ ------------------------------------------- ...
- MySQL闪回-binlog2sql
功能 提取SQL 生成回滚SQL 限制: mysql server必须开启,离线模式下不能解析binlog. binlog格式必须是row模式. flashback模式只支持DML,DDL将不 ...
- Yii 日志组件
详细的介绍查看官网的document:http://www.yiiframework.com/doc/guide/1.1/en/topics.logging 也可以看 Yii 1.1 Applicat ...
- ResNet 修改
https://github.com/tornadomeet/ResNet apache 开源项目 修改如下: 训练模块 import argparse,logging,os import mxnet ...
- Linux CentOS6系统安装最新版本Node.js环境及相关文件配置
Node.js,当前应用非常广泛的Javascript运行环境,采用C++编写的,目前应用较多的用于WEB应用中,执行效率还是非常高的,虽然老左不从业程序的开发,但是有些时候在玩VPS的时候还是会遇到 ...
- Powershell应用
- Tree - Rooted Trees
Rooted Trees A graph G = (V, E) is a data structure where V is a finite set of vertices and E is a b ...