Django路由与视图
路由层
一.路由匹配规则:
第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即匹配,直接执行对应的视图函数
url(r'login', views.login),
如果按上面的形式匹配的话就成模糊匹配了,login的前面没有限制条件,可以输入任意的字符串,login的后面也没有限制条件也是可以输入任意的字符串,这样的话导致只要我路径里面有login这样的关键字无论我输入什么都没有关系,都可以访问的到,怎么解决方式是在前面加^h和后面加$符号,这样的话就限制了,只要能是路径对了才能访问到,如下。
url(r'^login/$', views.login), #然后去写对应的视图函数就可以了
网站首页路由配置:
url(r'^$', views.login), #然后去写对应的视图函数就可以了
网页错误路由设置:
url(r'',views.error) #然后去写对应的视图函数就可以了
二.有名分组和无名分组传参
无名分组(将加括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数)
路由层
url(r'^login/(/d+)$', views.login), # ([0-9]{4})匹配4个数字然后进行分组
视图函数层
def login(request,year): # 如果分了一个组的话一定要的对应的视图函数加上一个函数,如果有两个就加上两个参数
print(year) # http://127.0.0.1:8000/login/2019 打印结果就是2019
return render(request,'login.html')
多个无名分组
路由层
url(r'^login/([0-9]{4})([0-9]{2})$', views.login), # ([0-9]{4})匹配4个数字然后进行分组 ([0-9]{2}) 匹配2个数字然后进行分组
视图函数层:
def login(request,*args): # 如果分了一个组的话一定要的对应的视图函数加上一个函数,如果有两个就加上两个参数
print(agrs) # http://127.0.0.1:8000/login/2019/06 打印结果就是(2019,06)
return render(request,'login.html')
有名分组:
有名分组(将加括号的正则表达式匹配到的内容当做关键字参数自动传递给对应的视图函数)
注意:无名分组和有名分组不能混着用!!!
路由层:
url(r'^index/(?P<year>\d+)/',views.index)
视图函数层方式一:
def index(request,year):
print(year)
return HttpResponse('test')
视图函数层方式二
def index(request,**kwargs):
print(kwargs)
return HttpResponse('test')
反向解析
根据名字动态获取对应的路径
前端模板方式
语法 {% url '路由的别名' %}
路由层:
url(r'^index111/', views.index,name='xxx'),
# 可以给每一个路由与视图函数对应关系起一个名字
# 这个名字能够唯一标识出对应的路径
# 注意这个名字不能重复是唯一的
前端模
<p><a href="{% url 'xxx' %}">1111111111111</a></p>s
后端方式
语法 reverse('路由的别名')
url(r'^index111/', views.index,name='xxx'),
视图函数层
def index(request):
if request.method == 'POST':
url = reverse('xxx')
return redirect(url)
return render(request,'index.html')
无名分组反向解析
后端
路由
url(r'^index/([0-9]{4})/', views.index,name='xxx'),
视图函数
def index(request,*age):
rl = reverse('xxx', args=(2019,))
print(rl)
return render(request,'index.html')
前端
路由
url(r'^index/([0-9]{4})/', views.index,name='xxx'),
前端html页面
<p>
<a href='{ % url 'xxx' 2019 % }'><a>
<p>
有名分组反向解析
后端使用
# 后端有名分组和无名分组都可以用这种形式
print(reverse('list',args=(10,)))
# 下面这个了解即可
print(reverse('list',kwargs={'year':10}))
前端使用
# 前端有名分组和无名分组都可以用这种形式
{% url 'list' 10 %}
# 下面这个了解即可
{% url 'list' year=10 %}
总结:针对有名分组与无名分组的反向解析统一采用一种格式即可
后端
reverse('list',args=(10,)) # 这里的数字通常都是数据的主键值
前端
{% url 'list' 10 %}
反向解析的本质:就是获取到一个能够访问名字所对应的视图函数
路由分发
路由分发
django每一个app下面都可以有自己的urls.py路由层,templates文件夹,static文件夹
项目名下urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发
路由分发的两种方式:
方式一:
总路由:
# 不需要导入任何东西
url(r'^app01','app01.urls'),
url(r'^app02','app02.urls')
app01路由:
在你创建app01的时候是app01下面是没有urls路由的需要自己手动创建,然后
把项目文件夹下的总路由copy到app01的路由下
urlpatterns = [
url(r'^index/', views.index),
]
方式二:
总路由:
# 只需要导入include和app01与app02的urls并取别名
并且去别名
from django.conf.urls import url,include
from app01 import urls as a1
from app02 import urls as a2
url(r'^app01',include(a1)),
url(r'^app02',include(a2)),
app01路由:
在你创建app01的时候是app01下面是没有urls路由的需要自己手动创建,然后
把项目文件夹下的总路由copy到app01的路由下
urlpatterns = [
url(r'^index/', views.index),
]
名称空间
名称空间(了解)
# 名称空间是避免多个app之间视图函数名重复
url(r'^app01/',include(app01_urls,namespace='app01')),
url(r'^app02/',include(app02_urls,namespace='app02'))
app01.urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index,name='index')
]
app02.urls.py
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^index/',views.index,name='index')
]
app01.views.py
reverse('app01:index')
app02.views.py
reverse('app02:index')
伪静态网页:
伪静态网页
搜索优化seo
url(r'^index.html',views.index,name='app01_index')
虚拟环境
虚拟环境
不同的项目配置不同的python解释器
django1.0与django2.0之间的区别
django2.0里面的path第一个参数不支持正则,你写什么就匹配,100%精准匹配
django2.0里面的re_path对应着django1.0里面的url
虽然django2.0里面的path不支持正则表达式,但是它提供五个默认的转换器
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
自定义转换器
1.正则表达式
2.类
3.注册
# 自定义转换器
class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value # 占四位,不够用0填满,超了则就按超了的位数来!
register_converter(FourDigitYearConverter, 'yyyy')
PS:路由匹配到的数据默认都是字符串形式
FBV与CBV
FBV与CBV
FBV:基于函数的视图
CBV:基于类的视图
CBV:
url(r'^mycls/',views.MyCls.as_view())
class MyCls(View):
def get(self,request):
return render(request,'index.html')
def post(self,request):
return HttpResponse('post')
无论是FBV还是CBV路由层都是路由对应视图函数内存地址
urlpatterns = [
# url(r'^mycls/',views.view)
url(r'^mycls/',views.MyCls.as_view())
]
class MyCls(View):
def get(self,request):
return render(request,'index.html')
def post(self,request):
return HttpResponse('post')
简单的文件上传
前端需要注意的点:
1.method需要指定成post
2.enctype需要改为formdata格式
后端暂时需要注意的是
1.配置文件中注释掉csrfmiddleware中间件
2.通过request.FILES获取用户上传的post文件数据
file_obj = request.FILES.get('my_file')
print(file_obj.name)
with open(file_obj.name,'wb') as f:
for line in file_obj.chunks():
f.write(line)
Django路由与视图的更多相关文章
- 第2天:Django路由与视图
在应用中创建视图定义路由 配置文件说明 静态文件使用 Django解析路由的流程 路由顺序 路由命名与reverse反推 在应用中创建视图定义路由 前面我们已经创建了子应用users,但是这个user ...
- FROM DELETE LIBRARY TO RUN の Django路由和视图
一.requests安装 · requests是什么? request是python实现的简单易使用的http库 · 如何安装? pip install requests ·检测是否成功 import ...
- Django基础(路由、视图、模板)
目录导航 Django 路由控制 Django 视图层 Django 模版层 Django 路由控制 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用 ...
- Django的View(视图)和路由系统
一.Django的View(视图) 1.介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一 ...
- Django Rest Framework 视图和路由
Django Rest Framework 视图和路由 DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们 ...
- 【python】-- Django路由系统(网址关系映射)、视图、模板
Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...
- day53_9_17 django数据库表关联,路由和视图
一.数据库的关系建立. 在原生的数据库语句中,建立表与表之间的联系,就是添加一个字段,将联系的表的id值添加到该字段中. django所作的也就是这些. 以图书管理系统为例,图书管理系统有四张表:书籍 ...
- Django drf:视图层封装、ViewSetMixin、路由配置、解析器、响应器
一.视图层封装 二.ViewSetMixin 三.路由配置 四.解析器 五.响应器 一.视图层封装 1.基本视图 写一个出版社的增删改查resfull接口 路由: url(r'^publish/$', ...
- Django基础三之路由、视图、模板
Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...
随机推荐
- Oracle学习笔记_01_SQL初步
1.分类 SQL语句分为以下三种类型: DML: Data Manipulation Language 数据操纵语言 DDL: Data Definition Languag ...
- python-Django监控系统二次开发Nagios
1.Nagios安装 yum install -y nagios.i686 yum install -y nagios-plugins-all.i686 安装完后会在apache的配置文件目录下/et ...
- codeforces 553A A. Kyoya and Colored Balls(组合数学+dp)
题目链接: A. Kyoya and Colored Balls time limit per test 2 seconds memory limit per test 256 megabytes i ...
- Python TCP通信网络编程
最近在看廖雪峰老师的基础教程(http://www.liaoxuefeng.com/),今天实现了一下简单Python的Socket的网络编程. 1. Socket网络编程 Socket是网络编程的一 ...
- mysql删除重复数据方法
create table tmp SELECT * from lhb t where t.id not in (select max(id) from lhb group by code,date,r ...
- bzoj 2594: 水管局长数据加强版 Link-Cut-Tree
题目: Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公 ...
- 使用IronPython集成Python和.NET
本文由 伯乐在线 - 艾凌风 翻译,Daetalus 校稿.未经许可,禁止转载!英文出处:www.informit.com.欢迎加入翻译组. 从两个优秀的世界各取所需,更高效的复用代码.想想就醉了,. ...
- 51nod 1301 集合异或和——异或dp
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1301 好题!看了TJ才会. 因为是不可重集合,所以当然有前 i 个 ...
- 不同类型input尺寸设置区别
最近发现为不用类型的input设置相同的尺寸,却得到了不一样的尺寸结果.发现不同类型的input的height和width竟然含义不同.在此小整理一下. (1)button类型 规律 button类型 ...
- centos6.6系统初始化脚本
#!/bin/bash # Program: # system_init_shell # History: # 2012/06/01 25061008@qq.com # Release: # 1.1 ...