Django 路由层与视图层
1.路由层
1.1无名分组
1.2 有名分组
1.3 反向解析
1.4 路由分发
1.5 名称空间 2.伪静态网页 3.虚拟环境 4.视图层
1.1 JsonResponse
1.2 FBV与CBV
1.3 文件上传 1.路由层
热身:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^reg/', views.reg),
url(r'^$', views.home),
url(r'',views.error) ] def home(request): return HttpResponse('首页') def error(request):
return HttpResponse('广告摊位显示页面') 遵循的原则:第一个是正则表达式,匹配规则按照从上往下的顺序,依次匹配直到匹配到第一个,立即停止匹配,
直接执行对应的视图函数,根据正则路由返回相应的结果。 所以上面的结果其实都是匹配为空,返回结果就是我们HttpResponse 对象。
只要ip和端口正确 输入任何字符 结果都为“首页” 下面的也是一样的
那么什么时候执行下面的呢当然是将它上面的注销即可。
1.1 无名分组
url(r'^test/(\d+)/',views.test) # 里面的内容是值匹配一个数字或者多个书数字 无名分组:将括号内的正则表达式路径匹配到的内容当做位置参数自动传给对应的视图函数
前端页面:http://127.0.0.1:8000/test/123456/ def test(request,aaa):
print(aaa) #
return HttpResponse('test') 返回test
1.2 有名分组
url(r'^test/(?P<year>\d+)/', views.test1) 注意:有名函数的写法。
有名分组(将加括号的正则表达式匹配到的内容当做关键字参数自动传递给对应的视图函数)
http://127.0.0.1:8000/test/2019/1243
year 匹配的是数据 def test1(request, year):
print(year)
return HttpResponse('test1')
注意;
url(r'(^test2/\d+)/(?P<year>\d+)', views.test2) 有名函数与无名函数不能一起使用
补充:
但是支持用一类型多个形式匹配
无名分组多个
url(r'^test/(\d+)/(\d+)/',views.test),
有名分组多个
url(r'^test/(?P<year>\d+)/(?P<xxx>\d+)/',views.test),
1.3 反向解析
定义:反向解析(跟据名字动态获取到对应路径) from django.shortcuts import reverse
url(r'^index888/$',views.index, name='index')
] 可以给每一个路由与视图对应关系起一个别名 这个名字能够唯一标识对应的路径
注意:这个名字不能重复是唯一的 前端使用使用:
{% url 'index' %} # index 就是你写的别名name='index' 页面可以动态解析
{% url '你给路由与视图函数对应关系起的别名' %} 后端使用:
reverse('index')
reverse('你给路由与视图函数对应关系起的别名')
无名分组反向解析:
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('esdit', args =(edit_id,))
{% url 'list' year=10 %} 有名解析后端使用
前端模版语法:反向解析本质以及应用场景 图书馆理系统 get 请求进行更改
{ % url 'edit' edit_id %}
总结:针对有名分组与无名分组的反向解析统一采用一种格式即可
后端
reverse('list',args=(10,)) # 这里的数字通常都是数据的主键值 也通常用的都是这个
前端
{% url 'list' book.pk %} # 可以建 book.pk 传到后端函数 有名或者无名 进行参数的的接收 def edit(request,edit_id)
反向解析的本质:就是获取到一个能够访问名字所对应的视图函数
有名分组的反向解析:
后端使用 有名分组和无名分组都可以用
print(revsers('list', args = (10,)) 这个一般用的比较多
def test(request,year):
print('xxx',year) # print(reverse('list',args=(10,))) 这个一般用的比较多
print(reverse('list',kwargs={'year':10})) 其实一样额
return HttpResponse('test')
1.4 路由分发
django每一个app下面都可以有自己的urls.py路由层,templates文件夹,static文件夹
项目名下urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发
from django.conf.urls import include # 路由分发 注意路由分发总路由千万不要$结尾
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
# 还可以 进行起别名
from django.conf.urls import
from app01 import urls as app01_urls # 这种太麻烦不推荐使用 # 在应用下新建urls.py文件,在该文件内写路由与视图函数的对应关系即可
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index)
]
1.5 名称空间
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')
2.伪静态网页
搜索优化seo 本质其实是动态网页只是.html 提高网页的索搜索频率 seo 查询效率
url(r'^index.html',views.index,name='app01_index')
3.虚拟环境:最多开两到三个 相当于 每次都重新装一个pycharm
不同的项目配置不同的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:路由匹配到的数据默认都是字符串形式
4.视图层
1.1 JsonResponse
1.2 FBV与CBV
FBV:基于函数的视图
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')
小白必会三板斧
HttpResponse
render
redirect
JsonResponse
from django.http import JsonResponse
def index(request):
# res = {'name':'Jason大帅比','password':18}
# return HttpResponse(json.dumps(res))
return JsonResponse({'name':'Jason大帅比','password':''},json_dumps_params={'ensure_ascii':False})
print('path:',request.path)
print('full_path:',request.get_full_path())
path: /upload_file/
full_path: /upload_file/?name=jason
1.3 文件上传:
简单的文件上传
前端需要注意的点:
1.method需要指定成post
2.enctype需要改为formdata格式 后端暂时需要注意的是
1.配置文件中注释掉csrfmiddleware中间件
2.通过request.FILES获取用户上传的post文件数据
后端函数实现功能:
def upload(request):
if request.method == 'POST':
print(request.FILES) #
<MultiValueDict: {'my_file': [<InMemoryUploadedFile: day55课堂笔记.md (application/octet-stream)>]}> #字典套列表
file_obj = request.FILES.get('my_file') # 注意获取文件通过前端传过来的my_file
拿到file_obj 文件对象day55课堂笔记.md
with open(file_obj.name,'wb')as f:
for line in file_obj:
f.write(line)
return HttpResponse('OK')
return render(request, 'upload.html')
前端页面就是form表单就行提交文件
<form action="" method="post" enctype="multipart/form-data">
<p><input type="file" name="my_file"></p> # 硬盘文件
<input type="submit" class="btn btn-primary">
</form>
待续......
Django 路由层与视图层的更多相关文章
- Django路由层与视图层、pycharm虚拟环境
一. Django路由层 路由层即对应项目文件下的urls.py文件.实际上每个APP中也可以有自己的urls.py路由层.templates文件夹及static文件夹.Django支持这么做,也为实 ...
- Django路由层与视图层
表与表之间建关系 图书管理系统为例 书籍表 出版社表 作者表 三个表之间的关系: 考虑表之间的关系:换位思考 1.书籍和出版社是一对多,外键字段建立在书籍表中 2.书籍和作者是多对多, 需要建立第三方 ...
- Django路由层、视图层
一.路由匹配: 第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个后立即停止 urlpatterns = [ url(r'^admin/', admin.site.urls), url( ...
- Django的路由层和视图层
一丶Django 的路由层(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django ...
- 052.Python前端Django框架路由层和视图层
一.路由层(URLconf) 1.1 路由层简单配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Dj ...
- 关于Django路由层简单笔记
Django—路由层 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个U ...
- django 路由层 伪静态网页 虚拟环境 视图层
路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页 虚拟环境 视图层 JsonResponse FBV与CBV 文件上传 项目urls.py下面 from app01 import ...
- $Django 路由层(有,无名分组、反向解析、总路由分发、名称空间、伪静态)
1 简单配置 -第一个参数是正则表达式(如果要精准匹配:'^publish/$') -第二个参数是视图函数(不要加括号) -url(r'^admin/', admin.site.urls), 注: ...
- django 实战篇之视图层
视图层(views.py) django必会三板斧 HttpResponse >>> 返回字符串 render >>> 支持模板语法,渲染页面,并返回给前端 red ...
随机推荐
- 字符串截取模板 && POJ 3450、3080 ( 暴力枚举子串 && KMP匹配 )
//截取字符串 ch 的 st~en 这一段子串返回子串的首地址 //注意用完需要根据需要最后free()掉 char* substring(char* ch,int st,int en) { ; c ...
- django-rest-swagger 使用【转】
转自:https://www.cnblogs.com/delav/p/10242017.html Swagger是一个API开发者的工具框架,用于生成.描述.调用和可视化RESTful风格的Web服务 ...
- C++ 对象间通信框架 V2.0 ××××××× 之(四)
类定义:CMemberFuncPointer ======================================================================= // Me ...
- 运行PHP出现No input file specified错误解决办法
配置了一台新服务器,使用的是IIS + Fastcgi + PHP 5.3.X,访问php页面的时候就会报错“No input file specified” 在php.ini文件里面修改: 1.增加 ...
- Redis 序列化方式StringRedisSerializer、FastJsonRedisSerializer和KryoRedisSerializer
当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的.RedisTemplate默认使用的是JdkSerializat ...
- AI移动,缓慢转身设置(针对AI Character)
AICharacter自身: Use Controller Rotation Yaw设为False Auto Possess AI 设为 Placed in World or Spawned Char ...
- Oracle--创建TRIGGER实现跟踪用户登录信息
---创建日志表记录用户登录信息create table user_log( user_id VARCHAR2(30), session_id NUMBER(10), ...
- 用shell和python实现数组的一个例子
目标是把字符串中的值等分为几段,取每段固定位置的值 shell脚本 #!/bin/bash ele="1 2 3 4 5 6" n= array1=() for x in $ele ...
- C3P0 详解
定义: C3P0是一个开源的JDBC连接池,目前使用它的开源项目有Hibernate,Spring等. 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需 ...
- HDFS——完全分布式搭建
架构 NN--namenode SNN--secondnamenode DN--datanode hadoop_env.sh中修改JAVA_HOME core-site.xml <propert ...