路由层

一.路由匹配规则:

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

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. [原]NYOJ-组合数-32

    大学生程序代写 http://acm.nyist.net/JudgeOnline/problem.php?pid=32 /*组合数 时间限制:3000 ms  |  内存限制:65535 KB 难度: ...

  2. [转]_int64、long long 的区别

    大学生程序代写 C++的64位整数[原]by 赤兔 http://baike.baidu.com/view/1235293.htm 在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常 ...

  3. error: ‘errno’ was not declared in this scope

    问题: 将一个c文件改为cpp文件,其中的perror()改用C++中的std::cerr << strerror(error) << std::endl;来替换. 重新编译文 ...

  4. freeMarker(十)——模板语言之内建函数

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.字符串内建函数 这些内建函数作用于表达式左侧的字符串值. 如果左侧 ...

  5. git常见使用情境整理

    一.版本回退 回退到某个commit版本的方法如下: 1. 查看commit历史 git log 找到想要回退的版本的号码,eg:f765889 2. 回退到该版本 git reset f765889 ...

  6. Java常见设计模式之工厂模式

    工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类:     1)简单工厂模式(Simple F ...

  7. 面向对象(Java中普通代码块,构造代码块,静态代码块区别及代码示例)

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 //普通代码块:在 ...

  8. java基础知识(9)---异常

    异 常: 异常:就是不正常.程序在运行时出现的不正常情况.其实就是程序中出现的问题.这个问题按照面向对象思想进行描述,并封装成了对象.因为问题的产生有产生的原因.有问题的名称.有问题的描述等多个属性信 ...

  9. java基础知识(6)---抽象类与接口

    抽象类: abstract抽象:不具体,看不明白.抽象类表象体现.在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所 ...

  10. delphi 线程教学第三节:设计一个有生命力的工作线程

    第三节:设计一个有生命力的工作线程   创建一个线程,用完即扔.相信很多初学者都曾这样使用过. 频繁创建释放线程,会浪费大量资源的,不科学.   1.如何让多线程能多次被复用?   关键是不让代码退出 ...