Django之路第二篇:路由配置
路由配置
1.路由
在Django中,路由文件的名称一般都是urls.py,顶级路由处于最开始建立的项目目录下。路由的主要作用就是使各个应用中views里面处理数据的函数与请求的url建立映射关系,以urls.py文件里面的路由为寻找路径,去寻找与请求对应的处理方法,从而返回给客户端http页面数据。
path()函数传递四个参数,需要两个:route和view,和两个可选kwargs和name。
(1)path()参数之route
route
是一个包含URL模式的字符串。在处理请求时,Django从第一个模式开始,urlpatterns
并在列表中向下,比较所请求的URL和每个模式,直到找到匹配的模式。
(2)path()参数之view
当Django找到一个匹配的模式时,它会以一个HttpRequest
对象作为第一个参数和路由中的任何“捕获”值作为关键字参数来调用指定的视图函数
(3)path()参数之kwargs
任意的关键字参数可以在字典中传递给目标视图。
(4)path()参数之name
命名您的URL可以让您从Django的其他地方明确地引用它,特别是在模板中。这个强大的功能使您可以对项目的URL模式进行全局更改,而只触摸单个文件。
2.路由规则
(1)静态路由
匹配规则:http://127.0.0.1:8000/index/
url(r'^index',views.index)
对应views.py文件:
1 from django.shortcuts import render 2 3 def index(request): 4 return render(request, "index.html")
(2)动态路由
① 匹配规则 http://127.0.0.1:8000/detail/432432 将最后面的数字当做参数传递给views.detail函数的nid参数
url(r'^detail/(\d+)', views.detail)
②匹配规则 http://127.0.0.1:8000/detail2/432432/2 将最后面的两个数字当做参数分别传递给views.detail函数的nid和nnid参数
url(r'^detail2/(\d+)/(\d+)', views.detail2)
③匹配规则 http://127.0.0.1:8000/detail3/432432/2 将最后面的两个数字根据自定义的名字当做参数分别传递给views.detail函数的p1和p2参数
url(r'^detail3/(?P<p1>\d+)/(?P<p2>\d+)', views.detail3)
对应的views.py文件:
1 from django.shortcuts import HttpResponse 2 3 def detail(request, nid): 4 print(nid) 5 return HttpResponse("OK") 6 7 def detail2(request, nid, nnid): 8 print(nid, nnid) 9 return HttpResponse("OK") 10 11 def detail3(request, p1, p2): 12 print(p1, p2) 13 return HttpResponse("OK")
编辑第一个页面响应
1.编辑blog.views
- 首先引入HttpResponse类
- 定义一个index函数,函数传入参数为request,函数返回HttpResponse
1 # myblog/blog/views.py 2 3 from django.http import HttpResponse 4 5 def index(request): 6 return HttpResponse("Hello,world!")
2.设置路由
找到myblog文件下面有一个urls.py文件,里面有一个urlpatterns数组,目前urlpatterns数组中已经配置好了admin的路由。由于目前还不知道怎么配置路由,我们可以先仿照着admin配置blog的路由。
- 首先引入blog
- 然后在urlpatterns里面添加blog路由函数
1 # myblog/myblog/urls.py 2 3 from django.contrib import admin 4 from django.urls import path 5 from blog import views 6 7 urlpatterns = [ 8 path('admin/', admin.site.urls), 9 path('index/', views.index), 10 ]
3.启动服务
-
打开命令行,进入项目中manage.py同级目录
-
命令行输入:python manage.py runserver 启动服务
-
打开浏览器输入网址:http://127.0.0.1:8000/index/
经过以上步骤,就可以在浏览器上看见“Hello,world!”字样。
改写第一个页面响应路由
我在创建第一个第一个页面响应的时候,将URL配置在了myblog/urls.py中。但是现在只建立一个同级的应用,如果以后增加到十个,甚至几十个同级或者嵌套的应用时呢,也都写在这里面,那看上去不是很臃肿吗。所以为了避免这种情况,就得优化它。
基于这些问题,采用的方法是:上一级urls.py只设置下一级的应用,而不能跳跃式设置嵌套应用url。
具体的步骤是:
-
在myblog/urls.py文件中引入include
-
在urlpatterns数组中的blog应用的url函数使用include
-
在blog文件夹下添加urls.py文件
-
在blog/urls.py文件中,按照正常的url添加路由
-
打开浏览器输入:http://127.0.0.1:8000/blog/,既可以正常访问
修改后的myblog/urls.py:
1 # myblog/urls.py 2 3 from django.contrib import admin 4 from django.urls import path,include 5 6 urlpatterns = [ 7 path('admin/', admin.site.urls), 8 path('blog/', include('blog.urls')), 9 ]
修改后的blog/urls.py:
1 # blog/urls.py 2 3 from django.conf.urls import url 4 from . import views 5 6 urlpatterns = [ 7 url('^$',views.index) 8 ]
当前的工程目录结构
myblog
|-----blog(应用目录)
|-----migrations(数据移植模块,内容自动生成)
|------__init__.py
|-----__init__.py
|-----admin.py(应用的后台管理系统配置)
|-----apps.py(应用的一些配置)
|-----models.py(数据模块,类似于MVC结构中的Models(模型))
|-----tests.py(自动化测试模块)
|-----views.py(执行响应的代码所在模块)
|-----urls.py(新增路由文件)
|-----myblog(项目目录)
|-----__init__.py
|-----settings.py(项目中的总配置文件)
|-----urls.py(URL配置文件)
|-----wsgi.py(Python应用与Web服务器之间的接口)
|-----db.sqlite3(数据库文件)
|-----manage.py(与项目进行交互的命令行工具集入口(项目管理器))