视图

负责接收请求和返回响应

FBV和CBV

  • FBV

    FBV(function base views) 就是在视图里使用函数处理请求。

     from django.conf.urls import url
    from django.contrib import admin from test_app import views
    urlpatterns = [
    url(r'^test/', views.test),
    ]

    /[project name]/urls.py

     from django.shortcuts import render
    
     def test(request):
    if (request.method == 'POST'):
    ... # do something
    else:
    ... # do something

    /[app name]/views.py

  • CBV

    CBV(class base views) 就是在视图里使用类处理请求。

     from django.conf.urls import url
    from django.contrib import admin from test_app import views
    urlpatterns = [
    url(r'^test/', views.Test.as_view()),
    ]

    /[project name]/urls.py

     from django.shortcuts import render
    from django.views import View class Test(View):
    def get(self, request):
    ... # do something def post(self, request):
    ... # do something

    /[app name]/views.py

request

1. request.method    # 获取请求的方法(GET、POST等)
2. request.GET # 通常用来获取URL里面的参数
3. request.POST # 用来获取POST提交过来的数据
4. request.path_info # 获取用户请求的路径(不包含IP和端口和URL参数)
5. request.body # 获取请求正文

response

1. HttpResponse        # 返回字符串内容
2. render # 渲染并返回html页面
3. redirect # 返回一个重定向
4. JsonResponse # 将对象序列化成Json格式字符串并返回

路由

格式

from django.conf.urls import url

urlpatterns = [
url([正则], [视图函数],[参数],name=[别名]),
] # 注意:Django 2.0中有所不同,如下:
from django.urls import path urlpatterns = [
path([正则], [视图函数],[参数],name=[别名]),
]

分组匹配

  • 位置匹配

     from django.conf.urls import url
    
     from test_app import views
    urlpatterns = [
    url(r'^test/([a-zA-z]+)/([0-9]{1,2})', views.Test.as_view()),
    ]

    /[project name]/urls.py

     from django.shortcuts import render, HttpResponse
    from django.views import View class Test(View):
    def get(self, request, name, age):
    resp_str = '姓名:{} 年龄:{}'.format(name,age)
    return HttpResponse(resp_str)

    /[app name]/views.py

    result

  • 命名匹配

     from django.conf.urls import url
    
     from test_app import views
    urlpatterns = [
    url(r'^test/(?P<name>[a-zA-z]+)/(?P<age>[0-9]{1,2})/', views.Test.as_view()),
    ]

    /[project name]/urls.py

     from django.shortcuts import render, HttpResponse
    from django.views import View class Test(View):
    def get(self, request, age, name):
    resp_str = '姓名:{} 年龄:{}'.format(name,age)
    return HttpResponse(resp_str)

    /[app name]/views.py

    result

include

可以让路由信息保存在多个文件中

 from django.conf.urls import url,include

 urlpatterns = [
url(r'^test_app/',include('test_app.urls'))
]

/[project name]/urls.py

 from django.conf.urls import url, include

 from . import views

 urlpatterns = [
url(r'^test', views.Test.as_view())
]

/[app name]/urls.py

上述配置对应的地址就是: http://localhost:8000/test_app/test

URL命名&反向解析

 from django.conf.urls import url
from test_app import views urlpatterns = [
url(r'^test/([a-zA-Z]+)/([0-9]{1,2})', views.Test.as_view(), name='test_name')
]

/[project name]/urls.py

 from django.shortcuts import render
from django.views import View
from django.urls import reverse class Test(View):
def get(self, request, name, age):
request_url = reverse('test_name',args=(name,age))
reverse_url = reverse('test_name',args=('zhangsan',20))
return render(request, 'test.html', {'request_url':request_url,'reverse_url': reverse_url})

/[app name]/views.py

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
请求的URL:
<br>
{{ request_url }}
<hr>
视图中解析:<br>
{{ reverse_url }}
<hr>
模板中解析:<br>
{% url 'test_name' 'zhangsan' 19 %}
</body>
</html>

/templates/test.html

result

补充

APPEND_SLASH

settings.py配置文件中默认没有 APPEND_SLASH这个项,但Django默认这个参数为 APPEND_SLASH = True。 作用就是自动在网址结尾加'/'。(测试不生效注意清理历史缓存)

给视图传递额外参数

 from django.conf.urls import url
from test_app import views urlpatterns = [
url(r'^test/([a-zA-Z]+)/([0-9]{1,2})', views.Test.as_view(), {'sex': 'male'})
]

/[project name]/urls.py

 from django.shortcuts import render, HttpResponse
from django.views import View class Test(View):
def get(self, request, age, name,sex):
resp_str = '姓名:{} 年龄:{} 性别:{}'.format(name,age,sex)
return HttpResponse(resp_str)

/[app name]/views.py

result

路由中的namespace

用于区分多个app中name相同的url

 from django.conf.urls import url, include
from test_app import views urlpatterns = [
url(r'^test/',views.Test.as_view()),
url(r'^test_app1/', include('test_app1.urls', namespace='app1')),
url(r'^test_app2/', include('test_app2.urls', namespace='app2')),
]

/django_test/urls.py

 from django.shortcuts import render
from django.views import View
from django.urls import reverse class Test(View):
def get(self, request):
app1_url = reverse('app1:same_name', args=('zhangsan', 19))
app2_url = reverse('app2:same_name', args=('lisi', 20))
return render(request, 'test.html', {'app1_url': app1_url, 'app2_url': app2_url})

/test_app/views.py

 from django.conf.urls import url, include

 from . import views

 urlpatterns = [
url(r'^test/([a-zA-Z]+)/([0-9]{1,2})', views.Test.as_view(), name='same_name')
]

/test_app1/urls.py

 from django.conf.urls import url, include

 from . import views

 urlpatterns = [
url(r'^test/([a-zA-Z]+)/([0-9]{1,2})', views.Test.as_view(), name='same_name')
]

/test_app2/urls.py

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
视图中使用
<br>
{{ app1_url }}
<br>
{{ app2_url }}
<hr>
模板中使用
<br>
{% url 'app1:same_name' 'zhangsan' 19%}
<br>
{% url 'app2:same_name' 'lisi' 20 %}
</body>
</html>

/templates/test.html

result

路由分发

路由可以以以下格式多级分发:

 from django.conf.urls import url
from img_upload import views urlpatterns = [
url(r'^user/', [(
url(r'^add/', views.add), # host:port/user/add/
url(r'^list/', views.list) # host:port/user/list/
), None, None]),
]

/django_test/urls.py

python框架之Django(4)-视图&路由的更多相关文章

  1. python框架之django

    python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...

  2. 第六篇:web之python框架之django

    python框架之django   python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...

  3. Python框架之Django学习

    当前标签: Django   Python框架之Django学习笔记(十四) 尛鱼 2014-10-12 13:55 阅读:173 评论:0     Python框架之Django学习笔记(十三) 尛 ...

  4. Python框架之Django的相册组件

    Python框架之Django的相册组件 恩,没错,又是Django,虽然学习笔记已经结贴,但是学习笔记里都是基础的,Django的东西不管怎么说还是很多的,要学习的东西自然不会仅仅用十几篇博文就能学 ...

  5. Python框架下django 的并发和多线程

    django 的并发能力真的是令人担忧,django本身框架下只有一个线程在处理请求,任何一个请求阻塞,就会影响另一个情感求的响应,尤其是涉及到IO操作时,基于框架下开发的视图的响应并没有对应的开启多 ...

  6. Python框架之Django学习笔记(十一)

    话说上次说到数据库的基本访问,而数据库我们主要进行的操作就是CRUD,也即是做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete),俗 ...

  7. python框架之Django(12)-认证系统之auth模块

    我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的终极框 ...

  8. python框架之Django(13)-admin组件

    使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLED_APPS ...

  9. python框架之Django(14)-rest_framework模块

    APIView django原生View post请求 from django.shortcuts import render, HttpResponse from django import vie ...

随机推荐

  1. The best manual of how to use "The easiest Xdebug" addon for Firefox

    Installation notes 0. Install the best Firefox add-on for remote debugging The easiest Xdebug. I'm n ...

  2. python 操作Sqlite

    Python sqlite 官方文档: https://docs.python.org/2/library/sqlite3.html 1. 连接 #!/usr/bin/python3 import s ...

  3. Web 呼起 APP

    1. iOS iOS 9+,用 universal links,可以在微信和 safari 中呼起 APP,并定位到指定 View iOS 8-,用 iframe + scheme,在微信中不可以呼起 ...

  4. MongoDB GridFS 存储文件

    使用MongoDB的GridFS方式. CSDN: https://blog.csdn.net/qq_32657967/article/details/81534259官方文档: https://do ...

  5. Linux iptables原理和使用

    1.原理 iptables简介 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵 ...

  6. python 文档

    python 文档 https://docs.python.org/2/library/index.html

  7. mysql 存储过程、循环

    CREATE PROCEDURE questionProc() BEGIN declare pgId ); declare pGuid varchar(); -- 定义游标卡尺 declare don ...

  8. 关于QT Graphics View开启OpenGL渲染后复选框、微调框等无法正常显示的问题

    之前学习QT Graphics View框架,除了基本的图元外,还可以通过QGraphicsProxyWidget类添加QT的基本Widget(如按钮.复选框.单选框等),常使用的场景类接口如下: Q ...

  9. mysql 字符串 拼接 截取 替换

    一. 字符串拼接 concat('asdf',str); 说明: 拼接asdf 和 str 二. 字符串截取 从左开始截取字符串 left(str, length) 说明:) as abstract ...

  10. HTML禁止右键复制【两行代码实现】

    很多的站长朋友会考虑保护网站的内容不被人复制,或者是不被人轻易的复制,下面就来告诉如何用两行代码来做HTML禁止右键复制html的方法: document.oncontextmenu=new Func ...