视图

负责接收请求和返回响应

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. jQuery(三) javascript跨域问题(JSONP解决)

    加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回 ...

  2. [svc]linux紧急情况处理

    如何判断 Linux 服务器是否被入侵? w-last-history top-lsof-strace netstat CPU利用率很高 800%爆了 netstat find 文件 查/etc/rc ...

  3. C语言 · 数字黑洞

    算法提高 数字黑洞   时间限制:1.0s   内存限制:256.0MB      问题描述 任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律: 1)将组成该四位数的四个数字由大到小 ...

  4. 【数据库】——SQLite使用drop column删除表字段

    由于项目需求变更,我需要在sqlite的表中删除一个字段,通用的sql操作语句如下: alter table task drop column custom_fields; 结果数据库提示如下错误: ...

  5. 【分享】Web前端开发第三方插件大全

    收集整理了一些Web前端开发比较成熟的第三方插件,分享给大家. ******************************************************************** ...

  6. Git:git diff 命令详解

    工作目录 vs 暂存区 $ git diff <filename> 意义:查看文件在工作目录与暂存区的差别.如果还没 add 进暂存区,则查看文件自身修改前后的差别.也可查看和另一分支的区 ...

  7. Ubuntu下安装open-falcon-v0.2.1

    在Ubuntu下安装open-falcon和Centos下安装的方法有点区别,因为Ubuntu使用的包管理器是apt-get,而Centos下使用的是Yum,建议不要再Ubuntu下使用yum 建议自 ...

  8. 使用 ES2015 编写 Gulp 构建

    Gulp 自 v3.9.0 版本增加对 Babel 的支持,也就是说可以使用 ES2015 语法来编写 gulp 任务. 检查 gulp 版本 $ gulp -v 确保 gulp-cli 和 gulp ...

  9. 《转载》RPC入门总结(一)RPC定义和原理

    转载:深入浅出 RPC - 浅出篇 转载:RPC框架与Dubbo完整使用 转载:深入浅出 RPC - 深入篇 转载:远程调用服务(RPC)和消息队列(Message Queue)对比及其适用/不适用场 ...

  10. Ubuntu系统的nginx启动

    在不同的linux系统中,安装nginx之后,要启动nginx,目录路径可能有一点不一样,如下是Ubuntu系统启动nginx,其他版本的linux系统可能不适用. Ubuntu安装之后的文件结构大致 ...