Django web架构学习(二)

in Python with 0 comment

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/,如下图所示:
1.png

urls捕获参数

url参数的捕获有两种方式:

如下所示在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/
如下图所示:
2.png

在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/,如下图所示
3.png

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/, 结果如下图:
4.png

现在我们就来说重定向,重定向常用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/

Responses