Django路由分组
通过上次的学习,我们已经对Django有了简单的了解,现在来深入了解下~
1. 路由系统
1.1 单一路由对应
a. urls
url(r'^login/', views.login), # login ---> 函数名 views.login
b. templates目录下的login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head> <body>
<form action="/login/" method="POST" enctype="multipart/form-data">
<p>
<input type="text" name="user" placeholder="用户名"/>
</p>
<p>
<input type="password" name="pwd" placeholder="密码"/>
</p>
<p>
男:<input type="radio" name="sex" value="男"/>
女:<input type="radio" name="sex" value="女"/>
</p>
<p>
<select name="city" multiple="multiple">
<option value="bj" >北京</option>
<option value="sh" >上海</option>
<option value="sz" >深圳</option>
</select>
</p>
<p>
<input type="file" name="upload"/>
</p>
<p>
<input type="submit" value="提交"/>
</p>
</form> </body>
</html>
c. views视图
USER_LIST = {}
def login(request):
if request.method == 'GET': #判断请求方式
return render(request, 'login.html')
elif request.method == 'POST':
user = request.POST.get('user') #post请求,单选、输入框获取值
pwd = request.POST.get('pwd')
sex = request.POST.get('sex')
#多选获取值
city = request.POST.getlist('city') # 上传文件
upload_file_obj = request.FILES.get('upload')
print(type(upload_file_obj), upload_file_obj) #<class 'django.core.files.uploadedfile.InMemoryUploadedFile'> 2.jpg
#保存上传的文件到upload目录
upload_path = os.path.join('upload', upload_file_obj.name)
fw = open(upload_path, 'wb') for line in upload_file_obj.chunks(): #chunks表示所有的数据库,是个迭代器
fw.write(line)
fw.close() if user and pwd:
USER_LIST['name'] = user
USER_LIST['pwd'] = pwd
USER_LIST['sex'] = sex
USER_LIST['city'] = city
USER_LIST['file'] = upload_file_obj.name
return render(request, 'success.html', {"user_list": USER_LIST})
else:
return HttpResponse('请求不能为空')
else:
return HttpResponse('请求方式不是get\post') #HttpResponse("字符串")
1.2 基于正则的路由
a. urls 路由设置
# url(r'^detail/', views.detail), #常规url方式,针对某个方法的写法
url(r'^detail-(\d+).html', views.detail), #通过正则匹配url,形式是: detail-xx
b, templates目录下的 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<!--
<ul>
{% for k,v in user_dict.items %}
<li><a target="_blank" href="/detail/?nid={{ k }}">{{ v.name }}</a></li>
{% endfor %}
</ul>
-->
<ul>
{% for k,v in user_dict.items %}
<li><a target="_blank" href="/detail-{{ k }}.html">{{ v.name }}</a></li>
{% endfor %}
</ul>
</body>
</html>
c. views视图
USER_DICT = {
"": {"name": "root1", "email": "qwe1@163.com"},
"": {"name": "root2", "email": "qwe2@163.com"},
"": {"name": "root3", "email": "qwe3@163.com"},
"": {"name": "root4", "email": "qwe4@163.com"},
}
def index(request):
return render(request, 'index.html', {"user_dict": USER_DICT}) #单一路由对应
# def detail(request):
# nid = request.GET.get('nid') #get请求方式,或者到nid的值,即USER_DICT的key
# detail_info = USER_DICT[nid]
# return render(request, 'detail.html', {"detail_info": detail_info}) #正则路由
def detail(request, nid):
# nid指定的是(\d+)里的内容
detail_info = USER_DICT[nid]
return render(request, 'detail.html', {"detail_info": detail_info})
1.3 正则分组
如果url涉及多个数字拼接,怎么区分接受的数据是nid ? 还是tid?
a, 在url.py增加对应路径
url(r'^index/', views.index),
# url(r'^detail/', views.detail), #常规url方式,针对某个方法的写法
# url(r'^detail-(\d+).html', views.detail), #通过正则匹配url,形式是: detail-xx
url(r'^detail-(?P<nid>\d+)-(?P<tid>\d+).html', views.detail), #通过正则分组,形式是: detail-xx-xx
b, templates目录下的 index.html
<ul>
{% for k,v in user_dict.items %}
<li><a target="_blank" href="/detail-{{ k }}-9.html">{{ v.name }}</a></li>
{% endfor %}
</ul>
c. views视图
#正则路由
# def detail(request, nid):
# # nid指定的是(\d+)里的内容
# detail_info = USER_DICT[nid]
# return render(request, 'detail.html', {"detail_info": detail_info}) def detail(request, **kwargs):
print(kwargs) # {'nid': '1', 'tid': '9'}
nid = kwargs.get("nid")
detail_info = USER_DICT[nid]
return render(request, 'detail.html', {"detail_info": detail_info})
1.4 为路由映射名称
如接口名称进行了变更,多次变更,涉及的trmplates、views 都需要进行修改,有什么办法可以解决这种方式? urls 路由设置name。
a, 在url.py增加name属性
urlpatterns = [
url(r'^asdfasdf/', views.exmplas_urls, name="demo1"),
url(r'^buy/(\d+)', views.exmplas_urls, name="demo2"),
url(r'^check/(?P<nid>\d+)/(?P<tid>\d+)', views.exmplas_urls, name="demo3"), ]
b. view视图
#为路由映射名称
def exmplas_urls(request):
if request.method == 'POST':
user = request.POST.get('user')
return render(request, 'demo.html', {'user': user})
else:
return render(request, 'demo.html') #为路由映射名称
def exmplas_urls(request, nid):
print(nid)
if request.method == 'POST':
user = request.POST.get('user')
return render(request, 'demo.html', {'user': user})
else:
return render(request, 'demo.html') #为路由映射名称
def exmplas_urls(request, **kwargs):
print(kwargs) #{'nid': '3', 'tid': '9'}
if request.method == 'POST':
user = request.POST.get('user')
return render(request, 'demo.html', {'user': user})
else:
return render(request, 'demo.html')
c. templates目录下的 demo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>urls映射名称</title>
</head>
<body> <!--1. 常规写法 action="/asdfasdf/" 优化写法:action="{% url "demo1" %}"
2. url正则 action="buy/6" 优化写法: action = {% url "demo2" 6 %}
3. url分组 action = "check/6/9" 优化写法: action = {% url "demo3" nid=3 tid=9 %}
-->
{{ user }}
<form action="{% url "demo3" nid=3 tid=9 %}" method="POST">
<p><input type="text" name="user" placeholder="用户名"/></p>
<p><input type="password" name="pwd" placeholder="密码"/></p>
<p><input type="submit" name="提交"/></p>
</form>
</body>
</html>
1.5 获取当前URL
view.py中配置:
def login(request):
print(request.path_info)
return render(request, 'path.html')
在templates目录下的path.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>当前URL</title>
</head>
<body>
<h1>当前url: {{ request.path_info }}</h1>
<form action="{{ request.path_info }}" method="POST">
<p><input type="text" name="user" placeholder="用户名称"/></p>
<p><input type="submit" value="刷新"/></p>
</form>
</body>
</html>
页面访问效果
1.6 根据app对路由分类
主程序urls.py文件
from django.contrib import admin
from django.conf.urls import url,include
from cmdb import views urlpatterns = [
url(r'cmdb/', include('cmdb.urls')),
url(r'cmdb02/', include('cmdb02.urls')), ]
cmdb下的urls.py文件
from django.conf.urls import url
from cmdb import views urlpatterns = [ url(r'login/', views.login)
]
cmdb02下的urls.py文件
from django.conf.urls import url
from cmdb02 import views urlpatterns = [
url(r'login/', views.login)
]
页面访问:
Django路由分组的更多相关文章
- Django路由系统-分组命名匹配
Django路由系统 分组命名匹配 在上述基本配置示例中,使用了简单的正则表达式分组匹配来捕获URL中的值并以位置参数的形式传递给视图,例如url(r'^articles/([0-9]{4})/( ...
- django之路由分组,路由分发,FBV,CBV,ORM框架
今日的内容: a. 路由系统 1. 创建app 2. 路由的分组 3. 路由的分发 - 正则表达式匹配 b. django的orm(模型model) 1. 创建模型的步骤 2. orm基本的增删改查 ...
- Django路由系统
django路由系统 简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从 ...
- Django 路由系统
Django 路由系统 基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说 ...
- Python菜鸟之路:Django 路由、模板、Model(ORM)
Django路由系统 Django的路由系统让Django可以根据URI进行匹配,进而发送至特定的函数去处理用户请求.有点类似nginx的location功能. Django的路由关系分为三种:普通关 ...
- Django路由控制总览
今日内容:(路由层) 1 简单配置 -第一个参数是正则表达式(如果要精准匹配:'^publish/$') -第二个参数是视图函数(不要加括号) -url(r'^admin/', admin.site. ...
- Python学习---Django路由系统【all】
Django URL (路由系统) Django URL (路由系统): URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映 ...
- 【python】-- Django路由系统(网址关系映射)、视图、模板
Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...
- django路由匹配层
目录 orm表关系如何建立 一对多 多对多 一对一 django请求生命周期流程图 路由层 路由的简单配置 Django路由匹配规律 分组 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态 虚 ...
随机推荐
- Python将字符串转换成字典
1. ast包 import ast user_info = '{"name" : "南湖", "gender" : "male& ...
- Return local beginning of day time object in Go
Both the title and the text of the question asked for "a local [Chicago] beginning of today tim ...
- 必须知道的String知识点
1.String 类型的概述 Java中String就是Unicode字符序列,例如,字符串"Java\u2122"由5个Unicode字符J.a.v.a和 ™ 组成.不像C/C+ ...
- 混合应用 微信登录授权 微信登录认证失败 ios PGWXAPI错误-1 code:-100 / 安卓 message:invalid appsecret innerCode:40125
最近项目需要做微信登录,于是利用HTML5+ API Reference的OAuth模块管理客户端的用户登录授权验证功能,允许应用访问第三方平台的资源.(链接:https://www.dcloud.i ...
- fs模块
fs.readdir(path, callback) 异步读取目录下文件 path - 文件路径. callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,fil ...
- 多任务案例--文件夹copy.py
import os import multiprocessing def copy_file(q,file_name,new_folder_name,old_folder_name): with op ...
- Web前端 --- 前端基础简介
目录 web端 HTTP协议 web端 1.前端,后端 什么是前端 任何与用户直接打交道的操作界面,都可以称之为前端, eg:电脑界面 手机界面 什么是后端 真正的幕后操作者 2.前端学习的历程 HT ...
- 使用jQuery快速高效制作网页交互特效-----JavaScript操作DOM对象
一.DOM操作分类 使用JavaScript操作DOM时通常分为三类:DOM Core.HTMl--DOM和CSS-DOM 二.访问节点 节点属性 三.节点信息 四.操作节点的属性 语法: ge ...
- java中日志打印
目录 一.预先判断日志级别 二.避免无效日志打印 三.区别对待错误日志 四.保证记录完整内容 打印日志,要注意下面4点. 一.预先判断日志级别 对DEBUG.INFO级别的日志,必须使用条件输出或者使 ...
- YARN构建--解决cypress下载慢问题
背景 注意: 此方案仅适合已经自行搭建私有仓库的用户使用 如非必要,尽可能使用软件开发云或其他服务提供的镜像站,避免此类特殊处理(会导致仓库维护成本增加) 场景描述 YARN构 ...