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路由匹配规律 分组 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态 虚 ...
随机推荐
- 2.Git 结构
1.Git 结构: 使用git add命令将写的代码暂存到暂存区:使用git commit命令将暂存区的代码提交到本地库: 2. Git 结构及其代码托管中心: workSpace:工作区(写代码). ...
- Resource接口
[转]https://blog.csdn.net/hbtj_1216/article/details/85487787 参考:官方文档 1 简介 Java标准库中的java.net.URL类和标准处理 ...
- Bootstrap 基本模板
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- Linux网络编程综合运用之MiniFtp实现(七)
上节中实现了配置文件的解析,这节来实现用户登录的验证,首先用客户端来登录vsftpd来演示登录的过程: 接着再连接miniftpd,来看下目前的效果: 接下来实现它,与协议相关的模块都是在ftppro ...
- 【恐怖的数组模拟】Secret Poems - HihoCoder - 1632
Secret Poems - HihoCoder - 1632 图一 图二 Following the order indicated by arrows, you can get “THISISAV ...
- [转]神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列
原文:https://www.cnblogs.com/youzhibing/p/11516154.html 这篇文章,对group by的讲解不错 -------------------------- ...
- Mac系统上,Firefox和Selenium不兼容的情况
解决办法,检查环境: Python 2.7.10 Firefox 46版本 Selenium 2.53.6 注意:将Firefox自动更新关闭,否则可能会出现自动升级以后无法执行Selenium用例的 ...
- 三、vue基础--表单绑定
表单输入绑定:可以一起使用以下修饰符,都是在v-model里面使用的,有input,radio,textrea,select中都可以使用绑定 1.单选按钮,代码如下: <div id='app' ...
- 必备的JS调试技巧汇总
转自http://www.jb51.net/article/88891.htm 前言:任何一个编程者都少不了要去调试代码,不管你是高手还是菜鸟,调试程序都是一项必不可少的工作.一般来说调试程序是在编写 ...
- 服务如何配置JVM
为了使JVM的资源利用更合理,往往需要手动设置JVM的初始值.下面将详细介绍不同环境下的JVM配置. 1.如果是应用程序,则:java -Xms800m -Xmx800m 你的类名 java -Xms ...