View 视图
View 视图
一、概述
- 作用
接收web请求返回web响应 - 本质
一个python函数 - 请求
客服端给服务端的数据 - 响应
类别很多
重定向 404访问不到 报错后的消息 json数据
二、路由
1、概述与配置
路由称为route 是一种与视图的关系映射
路由是把客户端的请求应用程序进行一对一的绑定映射
注意:路由唯一性
2、配置
ROOT_URLCONF = 'day2django.urls'
默认配置好的
3、url进行重新分配
-
目录层级
project
App
urls.py
project
urls.py
manage.py
在应用App下创建urls.py
在project下的urls里 使用include进行关联 -
App/urls.py
from django.urls import path
from . import viewsurlpatterns = [ # 首页的路由配置 path('index/', views.index), ] -
project/urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [ path('admin/', admin.site.urls), path('', include('App.urls')), ] -
include
-
导入
from django.urls import path, include -
作用
找到自路由模块 -
参数
- 自路由模块路径
- 命名空间namespace(用于反向解析 动态构造路由地址)
-
实例
path('', include(('App.urls','App'), namespace='App')), -
多个自路由模块
from django.contrib import admin
from django.urls import path, includeurlpatterns = [ path('admin/', admin.site.urls), path('App/', include(('App.urls','App'), namespace='App')), path('App2/', include(('App2.urls','App2'), namespace='App2')), ]注意:如果说自路由前面添加了前缀 访问的时候 就要添加上
http://127.0.0.1:8000/app/index/
-
三、视图
1、配置
-
位置
App/views.py 视图卸载views.py文件中 -
注意
无论当前是否有参数 都必须有一个req参数 接受请求过来的对象 -
路由
对视图函数进行映射 -
实例
from django.shortcuts import render, HttpResponse# Create your views here. def index(request): return HttpResponse('index') -
路由方法
匹配方式: 当django进行请求的时候 他会从 urlpattern进行依次匹配 直到匹配出匹配项 否则404- path 类似正则表达式 是一个匹配url的准则
- re_path 正则匹配路由
2、路由方法
-
path
参数- route 书写匹配url
- view 当django匹配到了url 就会执行特定的视图函数
- name 为url进行取名 目的是在任何位置 都能反向解析出当前路由地址
实例
path('index/', views.index, name='index'),
-
re_path
参数- route 书写正则表达式的路由地址
- view 当django匹配到了url 就会执行特定的视图函数
- name 为url进行取名 目的是在任何位置 都能反向解析出当前路由地址
re_path(r'^index2/$', views.index, name='index2'),
完全匹配 如果不添加^$ 路由中包含index2就可以访问了
-
注意
一个视图函数可以存在多个路由地址
from django.urls import path
from django.urls import re_pathfrom . import views urlpatterns = [ # 首页的路由配置 path(r'', views.index, name='index1'), path(r'index/', views.index, name='index2'), re_path(r'^index2/$', views.index, name='index3'), ]
3、定义视图
-
无参视图
路由地址
path(r'', views.index, name='index1'),
视图函数
from django.shortcuts import render, HttpResponse# Create your views here. def index(request): print(request) return HttpResponse('index') -
带参数路由
传递参数 视图函数需要接受参数- path
# 不限定参数类型
path(r'args// /', views.args, name='args1'),
# 限定参数类型为字符串和整数
path(r'args/str:name/int:age/', views.args, name='args'),
# 名字和视图函数参数对应的 不能随便写
path(r'args/str:name/int:age1/', views.args, name='args'),
# 作为了解 会认为name参数后面的所有 都为参数
path(r'args/str:name/path:age/', views.args, name='args'), - re_path
# 不起名称的传参
re_path(r'args/(\w+)/(\d{2})/', views.args, name='args'),
# 起名称的传参 名字和视图函数参数对应的 不能随便写
re_path(r'^args/(?P\w+)/(?P \d{2})/$', views.args, name='args'),
参数限定类型 如果类型不匹配则为404 参数匹配成功类型为str
- path
4、限制请求类型
from django.shortcuts import render, HttpResponse
from django.views.decorators.http import require_http_methods
# Create your views here.
@require_http_methods(['POST'])
def index(request):
print(request)
return HttpResponse('index')
允许类型写在require_http_methods(['POST']) 列表里 只有写在里面的请求方式 才是允许的
如果不使用当前装饰器则为 允许所有请求类型
5、错误视图
-
下面是常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
-
配置模板路径
settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')] -
更改DEBUG
settings.py
DEBUG = FalseALLOWED_HOSTS = ['*'] -
目录层级
project/
App/
project/
templates/
404.html
500.html -
404模板定制
在templates下创建404.html -
500模板定制
在templates下创建500.html
四、请求对象request
1、概述与作用
- 作用
客户端给服务器端传递数据用的 - 概述
- 服务器端接受http协议请求以后 会根据请求创建出请求对象
- 视图函数的第一个参数 为request
- request保存客户端传递过来的数据
2、属性
- path 请求的完整路径 不包含域名和端口
- method 请求的方式
- GET 类似字典对象 包含get请求的所有参数
- POST 类似字典对象 包含post请求的所有参数
- FILES 接受文件上传
- COOKIES 一个包含了字典的所有cookie
- session 包含了当前session值的对象 表示当前会话消息
- META 包含了http请求的所有头信息
实例
# 测试请求对象
def test_req(req):
print('path', req.path)
print('method', req.method)
print('GET',req.GET)
print('POST', req.POST)
print('FILES', req.FILES)
print('COOKIES', req.COOKIES)
print('session', req.session)
print('META', req.META)
print('META', req.META['HTTP_USER_AGENT'])
return HttpResponse('请求对象')
3、方法
- get_full_path() 获取完整请求
- get_host() 请求的主机和端口
- is_ajax() 是否为ajax请求
4、GET传参的方式
- 方式
- 通过路由进行传参
- url拼接get传参
- 实例
- 通过路由进行传参
path(r'args// /', views.args, name='args1'),
path(r'args/str:name/int:age/', views.args, name='args'),
def test(req, name, age):
return HttpResponse('请求对象')
注意 需要在视图函数上进行接收 - url拼接get传参 GET接收
使用get方法接收
在url地址中 使用?的形式进行拼接
请求地址:127.0.0.1:8000?key=value&key=value.....
def test(req):
print(req.GET)
return HttpResponse('请求对象')
注意:key不要重名
key重名的
- 通过路由进行传参
- get方法
请求地址:127.0.0.1:8000?key=value&key=value.....
def test(req):
print(req.GET.get('name'))
print(req.GET.get('age'))
print(req.GET.getlist('name'))
return HttpResponse('请求对象') - getlist方法
请求地址:127.0.0.1:8000?key=value&key=value.....
def test(req):
print(req.GET.getlist('name'))
return HttpResponse('请求对象')
可以接收同名的key的值 不会发生覆盖
5、POST方法
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册</h1>
<form action="" method="post">
{% csrf_token %}
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="userpass"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
views.py
def register(req):
if req.method == 'POST':
print(req.POST)
return HttpResponse('数据提交过来了')
return render(req, 'register.html')
五、响应对象 HttpResponse
1、概述与配置
- 概述
请求对象是由框架创建的 响应是由程序员来创建的 - 配置
from django.shortcuts import render, HttpResponse
from django.template.loader import render_to_string
from django.http import JsonResponse
2、使用
- HttpResponse 直接返回响应内容
def index(request):
print(request)
return HttpResponse('index') - render 渲染模板
参数- req 请求对象
- templates_name 模板名称
- contenxt 传递给模板数据
- status 状态码
def register(req):
if req.method == 'POST':
print(req.POST)
return HttpResponse('数据提交过来了')
return render(req, 'register.html',{'info':'后台python数据'})
- render_to_string 返回渲染后的字符串
def index(request):
# print(request)
# raise ValueError
data = render_to_string('register.html')
print(data)
return HttpResponse('index')
本文来自博客园,作者:寻月隐君,转载请注明原文链接:https://www.cnblogs.com/QiaoPengjun/articles/15946992.html

浙公网安备 33010602011771号