2Python全栈之路系列之Django路由与视图

  1. 云栖社区>
  2. 博客>
  3. 正文

2Python全栈之路系列之Django路由与视图

余二五 2017-11-07 19:27:00 浏览790
展开阅读全文

Python全栈之路系列之Django路由与视图


路由说白了就是与视图(函数)的对应关系,怎么说呢,一个路由对应一个视图,比如上面文章中所提到的那样,当打开/users/路径的时候会让users这个函数来进行逻辑处理,把处理的结果再返回到前端。

那么django是怎么知道从哪里找路由的配置文件入口呢?其实这在settings.py文件中已经被定义了:

1
ROOT_URLCONF = 'ansheng.urls'

路由的配置

绝对地址访问

1
2
# 访问地址必须是http://127.0.0.1:8000/hello/
url(r'^hello/$', views.hello),

使用正则与分组

在函数内需要接受year,month,day参数

1
url(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.deta),

deta视图必须接收以下参数:

1
def deta(request, year, month, day):

访问地址为:http://127.0.0.1:8000/2016/11/19/

传值

1
url(r'^(?P<year>[0-9]{4})/$', views.id, {'foo''bar'}),

id函数必须接受yearfoo参数

include分发,有利于解耦

1
2
# 当访问二级路由是cmdb的时候转发给app01.urls处理
url(r'^cmdb/$', include('app01.urls')),

别名

主要用于前端的from表单验证,如下实例,URLs地址的时候,因为from表单提交的地址使用了别名,所以会自动替换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^index/$', views.index, name='bieming'),
]
# views.py
from django.shortcuts import render,HttpResponse
def index(request):
    if request.method=='POST':
        username=request.POST.get('username')
        password=request.POST.get('password')
        if username=='as' and password=='123':
            return HttpResponse("登陆成功")
    return render(request, 'index.html')
# index.html
<form action="{% url 'bieming' %}" method="post">
     用户名:<input type="text" name="username">
     密码:<input type="password" name="password">
     <input type="submit" value="submit">
</form>

路由分解

可以使用incloud把很多个路由进行拆封,然后把不同的业务放到不同的urls中,首先我们创建项目及应用

1
2
3
4
5
6
7
8
# 创建DjangoProjects项目
E:\>django-admin.py startproject DjangoProjects
 
E:\>cd DjangoProjects
# 在项目内创建app1和app12应用
E:\DjangoProjects>python manage.py startapp app1
 
E:\DjangoProjects>python manage.py startapp app2

项目的urls.py文件内容

1
2
3
4
5
6
7
8
9
# E:\DjangoProjects\DjangoProjects\urls.py
from django.conf.urls import url, include
from django.contrib import admin
 
urlpatterns = [
    # 当路由匹配到一级路径为app1时,就把这个URL交给app1.urls再次进行匹配
    url(r'^app1/', include('app1.urls')),
    url(r'^app2/', include('app2.urls')),
]

应用的urls.pyviews.py文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# E:\DjangoProjects\app1\urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app1 import views
urlpatterns = [
    url(r'^hello/$', views.hello),
]
 
# E:\DjangoProjects\app1\views.py
from django.shortcuts import render,HttpResponse
def hello(request):
    return HttpResponse("Hello App1")
     
# E:\DjangoProjects\app2\urls.py
from django.conf.urls import url
from django.contrib import admin
from app2 import views
urlpatterns = [
    url(r'^hello/$', views.hello),
]
 
# E:\DjangoProjects\app2\views.py
from django.shortcuts import render,HttpResponse
def hello(request):
    return HttpResponse("Hello App2")
  1. 当访问http://127.0.0.1:8000/app1/hello/时返回内容Hello App1

  2. 当访问http://127.0.0.1:8000/app2/hello/时返回内容Hello App2

视图

http请求:HttpRequest对象
http响应:HttpResponse对象

HttpRequest对象属性

属性 描述
request.path 请求页面的路径,不包括域名
request.get_full_path() 获取带参数的路径
request.method 页面的请求方式
request.GET GET请求方式的数据
request.POST POST请求方式的数据

HttpResponse对象属性

属性 描述
render(request, ‘index.html’) 返回一个模板页面
render_to_response(‘index.html’) 返回一个模板页面
redirect(‘/login’) 页面跳转
HttpResponseRedirect(‘/login’) 页面跳转
HttpResponse(‘https://blog.ansheng.me‘) 给页面返回一个字符串










本文转自 Edenwy  51CTO博客,原文链接:http://blog.51cto.com/edeny/1925003,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论