Django的解析顺序
我们知道Django是使用的MVC的架构,首先通过MVC中的C就是control,用来接收url请求,对应我们django中的urls.py模块,M就代表Model,调用数据库的Model层,就是Django的models.py模块,然后经过业务逻辑层的处理,最后渲染到前端界面。前端就是MVC中的view层,对应django的view.py模块。
上篇文章已经提到一个初始的Django项目及应用包含如下几个文件功能:
$ cd djangotest/
$ tree
.
|-- djangotest
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
|-- linux
| |-- migrations
| | |--__init__.py
| |-- admin.py
| |-- apps.py
| |-- tests.py
| |-- urls.py
| |-- views.py
|
`-- templates
`-- db.sqlite3
`-- manage.py
其实所有的参数定义都是以setting.py为准,首先django先去setting.py中找到ROOT_URLCONF = 'djangotest.urls'找到总url。然后在djangotest下的urls.py文件中的urlpatterns列表变量,然后根据里面的URL的正则表达式进行解析,如果解析到,就调用第二个参数,第二个参数对应一个类或者一个函数,或者直接是一个前端页面,在经过类或者函数处理完以后,在展现在前端界面。而前端是单独的html文件,前端界面和后端处理分开,架构更加清晰。
在上面的目录结构中,每一个app都会有一个view.py, model.py,我们自己还要在创建一个url.py,通过include函数,在djangotest项目中的总urls.py分出去,把属于各自的app的url分配到不同的APP的urls.py文件中,这样可以降低耦合度,增加代码的健壮性。
urls作为程序的url入口,支持正则匹配,讲访问的url映射到view中的函数中。为了能调用每个app管理自己的url,我们首先需要在djangotest的urls.py文件中做如下修改:
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
path('admin/', admin.site.urls),
path('linux/', include('linux.urls')),
]
然后在创建linux/urls.py文件,编辑如下:
from django.conf.urls import url, include
from . import views
urlpatterns = [
url(r'^$', views.index),
]
而以上:http://127.0.0.1:8080/linux的url对应的就是view模块中的index函数,在linux的view.py中定义index函数
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse("这个是index页面!")
然后在浏览器上访问:http://127.0.0.1:8080/linux/,如下图所示:
urls捕获参数
url参数的捕获有两种方式:
- 捕获位置参数(可变参数):
在url函数中,使用正则表达式()进行捕获参数,然后在view中定义即可。
如下所示在urls.py中增加如下:
url(r'hello/p1(\w+)p2(.+)/$', views.hello),
在views.py中增加如下:
def hello(request, param1, param2):
return HttpResponse("hello {0}, hello {1}".format(param1, param2))
然后我们在浏览器上访问url:http://127.0.0.1:8080/linux/hello/p1lingp2xiang/
如下图所示:
- 捕获关键字参数:
在url函数中,正则表达是用(?P<keyword>)进行捕获,然后在views.py中定义即可
在urls.py中增加如下:
url(r'keyword/(?P<ip>\S+)/$', views.keyword),
在views.py中增加如下:
def keyword(request, ip):
return HttpResponse("the ip is {0}".format(ip))
在浏览器上访问url:http://127.0.0.1:8080/linux/keyword/1.1.1.1/,如下图所示
urls重定向
url函数定义形式如下:
def url(regex, view, kwargs=None, name=None):
参数含义: | |
---|---|
regex: | url匹配的正则字符串 |
view: | 一个可以调用的类型函数,或者使用include函数 |
kwargs: | 关键字参数,必须是一个字典,可以通过这个传递更多参数给views.py,views通过kwargs.get(“key”)得到对应value |
name: | 给URL取得别名,以后可以通过reverse函数进行重定向 |
对于kwargs如何传递参数,我们来看一个例子:
在urls.py中增加如下:
url(r'test/$', view=views.test, kwargs={"name": "ling"}, name="test"),
在views.py中增加如下:
def test(request, **kwargs):
return HttpResponse("{0}".format(kwargs.get("name")))
在浏览器上访问url:http://127.0.0.1:8080/linux/test/, 结果如下图:
现在我们就来说重定向,重定向常用name属性来进行重定向
修改urls.py
url(r'^$', views.index, name="index"),
url(r'redirect/$', view=views.redirect, name="redirect"),
修改views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
def redirect(request):
return HttpResponseRedirect(reverse("index"))
在浏览器上访问url:http://127.0.0.1:8080/linux/redirect,直接跳转到http://127.0.0.1:8080/linux/
本文由 Mr Gu 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 12, 2018 at 05:41 pm