Django--路由层、伪静态页面、虚拟环境、视图层
路由层:
在路由匹配的时候,第一个参数是一个正则表达式,这也就意味着在路由匹配的时候按照正则匹配的规则去匹配,路由匹配的顺序是从上往下依次匹配的,只要匹配到一个,就会执行对应的函数,就不会执行下面的函数了。
urlpatterns = [
url('^$', views.home), # 网站首页路由
url(r'^admin/', admin.site.urls),
url(r'^test/', views.test),
url(r'^test_add/', views.test_add),
url(r'^reg/', views.reg),
url(r'', views.error), # 网站不存在路由
]
# 注意第一个参数正则表达式,匹配规则按照从上往下依次匹配,,匹配到一个之后,就立即执行对应的视图函数 # 如果路由特别多的情况下,要考虑路由位置的放置,以免匹配到别的路由(要么更换路由的位置,要么跟换路由的路径)
无名分组
将加括号的正则表达式匹配到的内容当作位置参数自动传递给对应的视图函数
url(r'^test/(\d+)/', views.test), # 匹配一个或者多个数字
def test(request, a):
print(a)
return HttpResponse("test")
有名分组
将加括号的正表表达式匹配到的内容当作关键字参数自动传递给对应的视图函数
url(r'^test/(?P<year>\d+)/', views.test),
def test(request, year):
print(year)
return HttpResponse("test")
注意:无名分组和有名分组不能混合使用,但是可以使用多个无名分组,或者多个有名分组
反向解析:根据名字动态获取到对应路径
无名分组反向解析:
url(r'^test/(\d+)/',views.test,name='list')
后端使用:
print(reverse('list',args=(10,)))
前端使用:
{% url 'list' 10 %}
user_list = models.User.objects.all()
url(r'^edit/(\d+)/',views.edit,name='edit')
前端模版语法:
{%for user_obj in user_list%}
<a href='edit/{{ user_obj.pk }}/'></a>
{% endfor %}
视图函数:
from django.shortcuts import reverse
def edit(request,edit_id):
url = reverse('edit',args=(edit_id,))
模版:
{% url 'edit' edit_id %}
有名分组反向解析:
后端使用:
# 后端有名分组和无名分组都可以用这种形式
print(reverse('list',args=(10,)))
# 下面这个了解即可
{% url 'list' year=10 %}
总结:针对有名分组和无名分组的反向解析统一采用一种格式就可以了
后端:
reverse('list',args=(10,)) # 这里的数字通常都是数据的主键值
前端:
{% url 'list' 10 %}
反向解析的本质:就是获取到一个能够访问名字所对应的视图函数
定义:随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改
,那还是一件很麻烦的事情,而且可能会有一些超链接忘记修改。这时候就出现了反向解析,能够让连接根据正则表达式动态生成
应用范围:
模版中的超链接
视图中的重定向
使用的方法:
定义url时,需要为include定义namespace属性,为url定义name属性
使用的时候,在模版中使用url标签,在视图中使用reverse函数,根据正则表达式动态生成地址,减轻了后期维护的成本
from django.shortcuts import render, HttpResponse, redirect, reverse
可以给每一个路由与视图函数对应关系起一个名字,这个名字能够唯一标识出对应的关系,但是要注意这个名字不能够重复,要唯一的。
根据某一个名字获取到对应的路径
前端使用:
{ % url 'index'% }
{ % url '你给路由与视图函数对应关系起的别名' % }
后端使用:
reverse(‘你给路由与视图函数对应关系起的别名’)
无名分组的反向解析:
后端使用:
模版:
{% url 'edit' edit_id %}
前端使用:
路由分发:
django每一个app下面都可以有自己的urls.py路由层,templates文件夹,static文件夹
这时候项目名下面的urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发
# 其别名避免发生冲突
from app01 import urls as app01_urls
from app02 import urls as app02_urls
from django.conf.urls import url, include urlpatterns = [
# 在路由分发的时候,总路由千万不要用$结尾
url(r'^admin/', admin.site.urls),
url(r'^app01/', include(app01_urls)), # include是用来帮你做分发的
url(r'^app02/', include(app02_urls)) ]
在应用下新建urls.py文件,在该文件内写路由与视图函数的对应关系即可
from django.conf.urls import url
from app01 import views urlpatterns = [
url('^index', views.index) ]
名称空间:(了解)
url(r'^app01/', include(app01_urls, namespace="app01")),
url(r'^app02/', include(app02_urls, namespace="app02"))
app01下的urls:
urlpatterns = [
url('^index', views.index, name='index') ]
app01下的views:
def index(request):
print('app01:', reverse('app01:index'))
return render(request, 'index.html')
app02下的urls:
urlpatterns = [
url(r'^index/', views.index, name='index') ]
app02下的views:
def index(request):
print('app02:', reverse('app02:index'))
return HttpResponse('这个是app02的index!!!')
思考题:
import importlib importlib.import_module('app01.urls') # 等价于 from app01 import urls
伪静态页面:
搜索优化:seo
在路由的最后加上.html
虚拟环境:
不同的项目配置不同的python解释器
django1.0和django2.0之间的区别
django2.0里面的path的第一个参数不支持正则,你写什么就匹配什么,100%精准匹配
django2.0里面的re_path对应着django1.0里面的url
虽然2.0里面的path不支持正则表达式,但是它提供了五个默认的转换器:(了解)
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
自定义转换器:
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:前端匹配到的内容默认都是字符串形式
视图层:
JsonReponse
小白必会的三板斧:
HttpResponse
render
redirect
def index(request):
return JsonResponse(res, json_dumps_params={'ensure_ascii': False})
FBV与CBV
FBV:基于函数的视图
CBV:基于类的视图
要先将settings里面的'django.middleware.csrf.CsrfViewMiddleware',这句话注释掉,
from django.views import View class MyCls(View):
def get(self, request):
return render(request, 'index.html') def post(self, request):
return HttpResponse('post')
无论是FBV还是CBV路由层都是路由对应视图函数内存地址 然后在路由层:url(r'^mycls/', views.MyCls.as_view())
文件上传:
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="my_file">
<input type="submit">
</form>
def upload_file(request):
if request.method == 'POST':
print('path:', request.path) # 获取到的是一个相对的路径
print('full_path:', request.get_full_path()) # 获取到的是一个完整的路径
print(request.FILES)
file_obj = request.FILES.get('my_file')
with open(file_obj.name, 'wb') as f:
for line in file_obj.chunks(): # 自动将光标移动到首行,一行一行读...
f.write(line)
return HttpResponse('OK')
return render(request, 'index.html')
Django--路由层、伪静态页面、虚拟环境、视图层的更多相关文章
- django 路由层 伪静态网页 虚拟环境 视图层
路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页 虚拟环境 视图层 JsonResponse FBV与CBV 文件上传 项目urls.py下面 from app01 import ...
- $Django 虚拟环境,2.0、1.0路由层区别,Httprequest对象,视图层(fbv,cbv),文件上传
1 虚拟环境:解决问题同一台机器上可以运行不同版本的django, 1 用pychanrm创建--->files-->newproject--->选择虚拟环境 2 setting ...
- Django路由层与视图层、pycharm虚拟环境
一. Django路由层 路由层即对应项目文件下的urls.py文件.实际上每个APP中也可以有自己的urls.py路由层.templates文件夹及static文件夹.Django支持这么做,也为实 ...
- Django路由层与视图层
表与表之间建关系 图书管理系统为例 书籍表 出版社表 作者表 三个表之间的关系: 考虑表之间的关系:换位思考 1.书籍和出版社是一对多,外键字段建立在书籍表中 2.书籍和作者是多对多, 需要建立第三方 ...
- 关于Django路由层简单笔记
Django—路由层 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个U ...
- Django 路由层与视图层
1.路由层 1.1无名分组 1.2 有名分组 1.3 反向解析 1.4 路由分发 1.5 名称空间 2.伪静态网页 3.虚拟环境 4.视图层 1.1 JsonResponse 1.2 FBV与CBV ...
- Django路由层、视图层
一.路由匹配: 第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个后立即停止 urlpatterns = [ url(r'^admin/', admin.site.urls), url( ...
- $Django 路由层(有,无名分组、反向解析、总路由分发、名称空间、伪静态)
1 简单配置 -第一个参数是正则表达式(如果要精准匹配:'^publish/$') -第二个参数是视图函数(不要加括号) -url(r'^admin/', admin.site.urls), 注: ...
- Django --- 路由层(urls)
目录 1.orm表关系如何建立 2.django请求生命周期流程图 3.urls.py路由层 4.路由匹配 5.无名分组 6.有名分组 7.反向解析 8.路由分发 9.名称空间 10.伪静态 11.虚 ...
- django 路由层(反向解析)03
目录 ORM表关系建立 Django请求生命周期流程图 urls.py 路由层 无名分组 有名分组 反向解析 无名分组的反向解析 有名分组的反向解析 以编辑功能为例 路由分发 名称空间 伪静态 虚拟环 ...
随机推荐
- 问题解决:Maven execution terminated abnormally (exit code 1)
Maven execution terminated abnormally (exit code 1) 修改setting.xml中的镜像位置 如下就可以了 <mirror> <id ...
- C#3.0新增功能10 表达式树 06 生成表达式
连载目录 [已更新最新开发文章,点击查看详细] 到目前为止,你所看到的所有表达式树都是由 C# 编译器创建的. 你所要做的是创建一个 lambda 表达式,将其分配给一个类型为 Expressi ...
- [git] 基础命令笔记
--内容整理自廖雪峰的GIT教程-- git status 查看当前工作区状态,显示未跟踪的文件以及未上传的修改记录 git init 使当前文件夹变成Git可以管理的仓库 git add xxx 将 ...
- Docker部署web环境之Lanmp
1. 案例一 整套项目多容器分离通过docker-compose部署lanmp环境 中方文档参考网址: docker/kubernets网址 http://www.dockerinfo.net/doc ...
- 《VR入门系列教程》之14---面向大众的Unity3D
大众化的游戏引擎--Unity3D 并不是所有VR应用都是游戏,然而现在做VR开发的几乎都会用专业游戏引擎来做,因为游戏引擎既满足了一个引擎的要求又可以方便地制作出高品质的VR应用.一个游戏引 ...
- SSM - Mybatis SQL映射文件
MyBatis 真正的力量是在映射语句中.和对等功能的jdbc来比价,映射文件节省很多的代码量.MyBatis的构建就是聚焦于sql的. sql映射文件有如下几个顶级元素:(按顺序) cache配置给 ...
- IDEA创建普通java和web项目教程
1.第一个javaSE项目 01.双击idea运行IDE 02.配置JDK 03.创建项目的workspace .iml文件里面是当前项目的一些配置信息! 相当于web项目中的web.xml文件 04 ...
- DBeaver之连接hive初体验
工作中第一次和搞大数据的同事配合,他让我用hue看hive数据,,由于本人英语菜逼,hue全英文的页面看不习惯,遂找了一个DBeaver工具,我也是第一次使用这个工具,好像挺可以的,可以连mysql, ...
- Linux学习笔记03
一.Linux常见命令 file:查看文件类型(windows用扩展名识别文件类型) 语法:file [options] [args] -b:显示结果时,不显示文件名 -c:显示执行file命令的执行 ...
- CF803D 题解
题面 正解:一道二分大水题! A:为什么我得不到满分? B : 评测的系统不一样啊! A : 蛤? 正常情况下我们日常练习均使用的是windows系统,在windows下,string 本身是可以存储 ...