通过上次的学习,我们已经对Django有了简单的了解,现在来深入了解下~

1. 路由系统

 1.1 单一路由对应

a. urls

  1. url(r'^login/', views.login), # login ---> 函数名 views.login

b. templates目录下的login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>登录</title>
  6. </head>
  7.  
  8. <body>
  9. <form action="/login/" method="POST" enctype="multipart/form-data">
  10. <p>
  11. <input type="text" name="user" placeholder="用户名"/>
  12. </p>
  13. <p>
  14. <input type="password" name="pwd" placeholder="密码"/>
  15. </p>
  16. <p>
  17. 男:<input type="radio" name="sex" value="男"/>
  18. 女:<input type="radio" name="sex" value="女"/>
  19. </p>
  20. <p>
  21. <select name="city" multiple="multiple">
  22. <option value="bj" >北京</option>
  23. <option value="sh" >上海</option>
  24. <option value="sz" >深圳</option>
  25. </select>
  26. </p>
  27. <p>
  28. <input type="file" name="upload"/>
  29. </p>
  30. <p>
  31. <input type="submit" value="提交"/>
  32. </p>
  33. </form>
  34.  
  35. </body>
  36. </html>

c. views视图

  1. USER_LIST = {}
  2. def login(request):
  3. if request.method == 'GET': #判断请求方式
  4. return render(request, 'login.html')
  5. elif request.method == 'POST':
  6. user = request.POST.get('user') #post请求,单选、输入框获取值
  7. pwd = request.POST.get('pwd')
  8. sex = request.POST.get('sex')
  9. #多选获取值
  10. city = request.POST.getlist('city')
  11.  
  12. # 上传文件
  13. upload_file_obj = request.FILES.get('upload')
  14. print(type(upload_file_obj), upload_file_obj) #<class 'django.core.files.uploadedfile.InMemoryUploadedFile'> 2.jpg
  15. #保存上传的文件到upload目录
  16. upload_path = os.path.join('upload', upload_file_obj.name)
  17. fw = open(upload_path, 'wb')
  18.  
  19. for line in upload_file_obj.chunks(): #chunks表示所有的数据库,是个迭代器
  20. fw.write(line)
  21. fw.close()
  22.  
  23. if user and pwd:
  24. USER_LIST['name'] = user
  25. USER_LIST['pwd'] = pwd
  26. USER_LIST['sex'] = sex
  27. USER_LIST['city'] = city
  28. USER_LIST['file'] = upload_file_obj.name
  29. return render(request, 'success.html', {"user_list": USER_LIST})
  30. else:
  31. return HttpResponse('请求不能为空')
  32. else:
  33. return HttpResponse('请求方式不是get\post') #HttpResponse("字符串")

  1.2  基于正则的路由

    a. urls 路由设置

  1. # url(r'^detail/', views.detail), #常规url方式,针对某个方法的写法
  2. url(r'^detail-(\d+).html', views.detail), #通过正则匹配url,形式是: detail-xx

b, templates目录下的 index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>index</title>
  6. </head>
  7. <body>
  8. <!--
  9. <ul>
  10. {% for k,v in user_dict.items %}
  11. <li><a target="_blank" href="/detail/?nid={{ k }}">{{ v.name }}</a></li>
  12. {% endfor %}
  13. </ul>
  14. -->
  15. <ul>
  16. {% for k,v in user_dict.items %}
  17. <li><a target="_blank" href="/detail-{{ k }}.html">{{ v.name }}</a></li>
  18. {% endfor %}
  19. </ul>
  20. </body>
  21. </html>

c. views视图

  1. USER_DICT = {
  2. "": {"name": "root1", "email": "qwe1@163.com"},
  3. "": {"name": "root2", "email": "qwe2@163.com"},
  4. "": {"name": "root3", "email": "qwe3@163.com"},
  5. "": {"name": "root4", "email": "qwe4@163.com"},
  6. }
  7. def index(request):
  8. return render(request, 'index.html', {"user_dict": USER_DICT})
  9.  
  10. #单一路由对应
  11. # def detail(request):
  12. # nid = request.GET.get('nid') #get请求方式,或者到nid的值,即USER_DICT的key
  13. # detail_info = USER_DICT[nid]
  14. # return render(request, 'detail.html', {"detail_info": detail_info})
  15.  
  16. #正则路由
  17. def detail(request, nid):
  18. # nid指定的是(\d+)里的内容
  19. detail_info = USER_DICT[nid]
  20. return render(request, 'detail.html', {"detail_info": detail_info})

  1.3 正则分组

     如果url涉及多个数字拼接,怎么区分接受的数据是nid ? 还是tid?

a, 在url.py增加对应路径

  1. url(r'^index/', views.index),
  2. # url(r'^detail/', views.detail), #常规url方式,针对某个方法的写法
  3. # url(r'^detail-(\d+).html', views.detail), #通过正则匹配url,形式是: detail-xx
  4. url(r'^detail-(?P<nid>\d+)-(?P<tid>\d+).html', views.detail), #通过正则分组,形式是: detail-xx-xx

b, templates目录下的 index.html

  1. <ul>
  2. {% for k,v in user_dict.items %}
  3. <li><a target="_blank" href="/detail-{{ k }}-9.html">{{ v.name }}</a></li>
  4. {% endfor %}
  5. </ul>

c. views视图

  1. #正则路由
  2. # def detail(request, nid):
  3. # # nid指定的是(\d+)里的内容
  4. # detail_info = USER_DICT[nid]
  5. # return render(request, 'detail.html', {"detail_info": detail_info})
  6.  
  7. def detail(request, **kwargs):
  8. print(kwargs) # {'nid': '1', 'tid': '9'}
  9. nid = kwargs.get("nid")
  10. detail_info = USER_DICT[nid]
  11. return render(request, 'detail.html', {"detail_info": detail_info})

1.4  为路由映射名称

    如接口名称进行了变更,多次变更,涉及的trmplates、views 都需要进行修改,有什么办法可以解决这种方式?  urls 路由设置name。

a, 在url.py增加name属性

  1. urlpatterns = [
  2. url(r'^asdfasdf/', views.exmplas_urls, name="demo1"),
  3. url(r'^buy/(\d+)', views.exmplas_urls, name="demo2"),
  4. url(r'^check/(?P<nid>\d+)/(?P<tid>\d+)', views.exmplas_urls, name="demo3"),
  5.  
  6. ]

b. view视图

  1. #为路由映射名称
  2. def exmplas_urls(request):
  3. if request.method == 'POST':
  4. user = request.POST.get('user')
  5. return render(request, 'demo.html', {'user': user})
  6. else:
  7. return render(request, 'demo.html')
  8.  
  9. #为路由映射名称
  10. def exmplas_urls(request, nid):
  11. print(nid)
  12. if request.method == 'POST':
  13. user = request.POST.get('user')
  14. return render(request, 'demo.html', {'user': user})
  15. else:
  16. return render(request, 'demo.html')
  17.  
  18. #为路由映射名称
  19. def exmplas_urls(request, **kwargs):
  20. print(kwargs) #{'nid': '3', 'tid': '9'}
  21. if request.method == 'POST':
  22. user = request.POST.get('user')
  23. return render(request, 'demo.html', {'user': user})
  24. else:
  25. return render(request, 'demo.html')

c. templates目录下的 demo.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>urls映射名称</title>
  6. </head>
  7. <body>
  8.  
  9. <!--1. 常规写法 action="/asdfasdf/" 优化写法:action="{% url "demo1" %}"
  10. 2. url正则 action="buy/6" 优化写法: action = {% url "demo2" 6 %}
  11. 3. url分组 action = "check/6/9" 优化写法: action = {% url "demo3" nid=3 tid=9 %}
  12. -->
  13. {{ user }}
  14. <form action="{% url "demo3" nid=3 tid=9 %}" method="POST">
  15. <p><input type="text" name="user" placeholder="用户名"/></p>
  16. <p><input type="password" name="pwd" placeholder="密码"/></p>
  17. <p><input type="submit" name="提交"/></p>
  18. </form>
  19. </body>
  20. </html>

 1.5 获取当前URL

view.py中配置:

  1. def login(request):
  2. print(request.path_info)
  3. return render(request, 'path.html')

在templates目录下的path.html文件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>当前URL</title>
  6. </head>
  7. <body>
  8. <h1>当前url: {{ request.path_info }}</h1>
  9. <form action="{{ request.path_info }}" method="POST">
  10. <p><input type="text" name="user" placeholder="用户名称"/></p>
  11. <p><input type="submit" value="刷新"/></p>
  12. </form>
  13. </body>
  14. </html>

页面访问效果

1.6 根据app对路由分类

主程序urls.py文件

  1. from django.contrib import admin
  2. from django.conf.urls import url,include
  3. from cmdb import views
  4.  
  5. urlpatterns = [
  6. url(r'cmdb/', include('cmdb.urls')),
  7. url(r'cmdb02/', include('cmdb02.urls')),
  8.  
  9. ]

cmdb下的urls.py文件

  1. from django.conf.urls import url
  2. from cmdb import views
  3.  
  4. urlpatterns = [
  5.  
  6. url(r'login/', views.login)
  7. ]

cmdb02下的urls.py文件

  1. from django.conf.urls import url
  2. from cmdb02 import views
  3.  
  4. urlpatterns = [
  5. url(r'login/', views.login)
  6. ]

页面访问:

http://127.0.0.1:8000/cmdb/login/

http://127.0.0.1:8000/cmdb02/login/

Django路由分组的更多相关文章

  1. Django路由系统-分组命名匹配

    Django路由系统 分组命名匹配 ​ 在上述基本配置示例中,使用了简单的正则表达式分组匹配来捕获URL中的值并以位置参数的形式传递给视图,例如url(r'^articles/([0-9]{4})/( ...

  2. django之路由分组,路由分发,FBV,CBV,ORM框架

    今日的内容: a. 路由系统 1. 创建app 2. 路由的分组 3. 路由的分发 - 正则表达式匹配 b. django的orm(模型model) 1. 创建模型的步骤 2. orm基本的增删改查 ...

  3. Django路由系统

    django路由系统 简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从 ...

  4. Django 路由系统

    Django 路由系统 基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说 ...

  5. Python菜鸟之路:Django 路由、模板、Model(ORM)

    Django路由系统 Django的路由系统让Django可以根据URI进行匹配,进而发送至特定的函数去处理用户请求.有点类似nginx的location功能. Django的路由关系分为三种:普通关 ...

  6. Django路由控制总览

    今日内容:(路由层) 1 简单配置 -第一个参数是正则表达式(如果要精准匹配:'^publish/$') -第二个参数是视图函数(不要加括号) -url(r'^admin/', admin.site. ...

  7. Python学习---Django路由系统【all】

    Django URL (路由系统) Django URL (路由系统): URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映 ...

  8. 【python】-- Django路由系统(网址关系映射)、视图、模板

    Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...

  9. django路由匹配层

    目录 orm表关系如何建立 一对多 多对多 一对一 django请求生命周期流程图 路由层 路由的简单配置 Django路由匹配规律 分组 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态 虚 ...

随机推荐

  1. 2.Git 结构

    1.Git 结构: 使用git add命令将写的代码暂存到暂存区:使用git commit命令将暂存区的代码提交到本地库: 2. Git 结构及其代码托管中心: workSpace:工作区(写代码). ...

  2. Resource接口

    [转]https://blog.csdn.net/hbtj_1216/article/details/85487787 参考:官方文档 1 简介 Java标准库中的java.net.URL类和标准处理 ...

  3. Bootstrap 基本模板

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  4. Linux网络编程综合运用之MiniFtp实现(七)

    上节中实现了配置文件的解析,这节来实现用户登录的验证,首先用客户端来登录vsftpd来演示登录的过程: 接着再连接miniftpd,来看下目前的效果: 接下来实现它,与协议相关的模块都是在ftppro ...

  5. 【恐怖的数组模拟】Secret Poems - HihoCoder - 1632

    Secret Poems - HihoCoder - 1632 图一 图二 Following the order indicated by arrows, you can get “THISISAV ...

  6. [转]神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列

    原文:https://www.cnblogs.com/youzhibing/p/11516154.html 这篇文章,对group by的讲解不错 -------------------------- ...

  7. Mac系统上,Firefox和Selenium不兼容的情况

    解决办法,检查环境: Python 2.7.10 Firefox 46版本 Selenium 2.53.6 注意:将Firefox自动更新关闭,否则可能会出现自动升级以后无法执行Selenium用例的 ...

  8. 三、vue基础--表单绑定

    表单输入绑定:可以一起使用以下修饰符,都是在v-model里面使用的,有input,radio,textrea,select中都可以使用绑定 1.单选按钮,代码如下: <div id='app' ...

  9. 必备的JS调试技巧汇总

    转自http://www.jb51.net/article/88891.htm 前言:任何一个编程者都少不了要去调试代码,不管你是高手还是菜鸟,调试程序都是一项必不可少的工作.一般来说调试程序是在编写 ...

  10. 服务如何配置JVM

    为了使JVM的资源利用更合理,往往需要手动设置JVM的初始值.下面将详细介绍不同环境下的JVM配置. 1.如果是应用程序,则:java -Xms800m -Xmx800m 你的类名 java -Xms ...