路由层

一.路由匹配规则:

第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即匹配,直接执行对应的视图函数

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路由与视图的更多相关文章

  1. 第2天:Django路由与视图

    在应用中创建视图定义路由 配置文件说明 静态文件使用 Django解析路由的流程 路由顺序 路由命名与reverse反推 在应用中创建视图定义路由 前面我们已经创建了子应用users,但是这个user ...

  2. FROM DELETE LIBRARY TO RUN の Django路由和视图

    一.requests安装 · requests是什么? request是python实现的简单易使用的http库 · 如何安装? pip install requests ·检测是否成功 import ...

  3. Django基础(路由、视图、模板)

    目录导航 Django 路由控制 Django 视图层 Django 模版层 Django 路由控制 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用 ...

  4. Django的View(视图)和路由系统

    一.Django的View(视图) 1.介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一 ...

  5. Django Rest Framework 视图和路由

    Django Rest Framework 视图和路由   DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们 ...

  6. 【python】-- Django路由系统(网址关系映射)、视图、模板

    Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...

  7. day53_9_17 django数据库表关联,路由和视图

    一.数据库的关系建立. 在原生的数据库语句中,建立表与表之间的联系,就是添加一个字段,将联系的表的id值添加到该字段中. django所作的也就是这些. 以图书管理系统为例,图书管理系统有四张表:书籍 ...

  8. Django drf:视图层封装、ViewSetMixin、路由配置、解析器、响应器

    一.视图层封装 二.ViewSetMixin 三.路由配置 四.解析器 五.响应器 一.视图层封装 1.基本视图 写一个出版社的增删改查resfull接口 路由: url(r'^publish/$', ...

  9. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

随机推荐

  1. 几个常用的url生成二维码的接口

    找到了几个URL生成的接口,速度上可能会有差别,可试验后选用,我用过第一个,分享: <!doctype html> <html lang="en"> < ...

  2. NYOJ--42--dfs水过||并查集+欧拉通路--一笔画问题

    dfs水过: /* Name: NYOJ--42--一笔画问题 Author: shen_渊 Date: 18/04/17 15:22 Description: 这个题用并查集做,更好.在练搜索,试试 ...

  3. python中zip()函数基本用法

    zip()函数接受一系列可迭代对象作为参数,将不同对象中相对应的元素打包成一个元组(tuple),返回由这些元组组成的list列表,如果传入的参数的长度不等,则返回的list列表的长度和传入参数中 ...

  4. IO - 文件的读取与写入

    最近有较多提取文档内容,然后拼接成sql之类的,但是纯粹的复制粘贴又太傻,就写了一个脚本,自动读取文件内容(word文档可能需要复制成txt文本),然后拼接sql,最后写入到指定文件中,试了下还是蛮好 ...

  5. pytorch--cpu与gpu load时相互转化

    pytorch------cpu与gpu load时相互转化 torch.load(map_location=)学习 将gpu改为cpu时,遇到一个报错:RuntimeError: Attemptin ...

  6. 搭建DNS服务器-bind

    1. 安装 yum install -y bind-chroot yum install -y bind-utils service named-chroot start    2. 修改配置 增加一 ...

  7. Ajax知识点整理

    一.javascript原生Ajax 1.简介 Ajax是Asynchronous JavaScript+XML(异步JavaScript和XML)的缩写. 该名称诞生于XML还是数据传输首选格式的时 ...

  8. redhat 安装lamp

    安装Apache yum install httpd 安装MySql yum install mysql mysql-server 安装php yum install php 安装php的mysql模 ...

  9. Poj 1887 Testing the CATCHER(LIS)

    一.Description A military contractor for the Department of Defense has just completed a series of pre ...

  10. 【转】Pro Android学习笔记(十五):用户界面和控制(3):Button控件

    目录(?)[-] 基础Button ImageButton ToggleButton CheckBox RadioButton 基础Button Button是最常用的基础控件之一,在Android中 ...