173人参与 • 2024-08-02 • 网页播放器
def index(request): 这个request其实就是内部已经封装好的http请求httprequest,它是一个请求对象
django中的视图主要用来接受web请求,并做出响应。
视图的本质就是一个python中的函数
视图的响应分为两大类
1) 以json数据形式返回(jsonresponse)
2) 以网页的形式返回
2.1) 重定向到另一个网页(httpresponseredirect)
2.2) 错误视图(4xx,5xx)(httpresponsenotfound,httpresponseforbidden,httpresponsenotallowed等)
视图响应过程:
浏览器输入-> urls 路由匹配 -> 视图响应 -> 回馈到浏览器
视图参数:
1)一个httprequest的实例,一般命名为request
2)通过ur1正则表达式传递过来的参数
位置:
通常在应用下的views.py中定义
错误视图:
1)404视图(页面没找到)
2)400视图(客户操作错误)
3) 500视图 (服务器内部错误)
服务器在接收到http请求后,会根据报文创建httprequest对象
视图中的第一个参数就是httprequest对象
django框架接收到http请求之后会将http请求包装为httprequest对象,之后传递给视图。
request常用属性和方法
属性:
path 请求的完整路径
method 请求的方法,常用get,post
get 类似字典的参数,包含了get的所有参数
post 类似字典的参数,包含了post所有参数
files 类似字典的参数,包含了上传的文件
cookies 字典,包含了所有cookie
session 类似字典,表示会话
meta['remote_addr']
方法:
is_ajax() 判断是否是ajax(),通常用在移动端和js中
get_full_path() 返回包含参数字符串的请求路径
querydict: 类字典的对象
类似字典的数据结构。与字典的区别:可以存在相同的键。
querydict中数据获取方式
dict['uname']或 dict.get('uname')
获取指定key对应的所有值
dict.getlist('uname')
服务器返回给客户端的数据
httpresponse由程序员自己创建
1)不使用模板,直接调用httpresponse(),返回httpresponse对象。
2)调用模板,进行渲染。
使用render
render(request,template_name[,context])
request 请求体对象
template_name 模板路径
context 字典参数,用来填坑
属性: content 返回的内容
charset 编码格式
status_code 响应状态码(2xx,3xx,4xx,5xx)
方法:
write(xxx) 直接写出文本
flush() 冲刷缓冲区
set_cookie(key,value='xxx',max_age=none) 设置cookie
delete_cookie(key) 删除cookie
httpresponse子类
httpresponseredirect
响应重定向:可以实现服务器内部跳转
return httpresponseredict('/grade/2030')
使用的时候推荐使用反向解析
jsonresponse
返回json数据的请求,通常用在异步请求上
jsonresponse(dict)
返回json数据时,content-type是application/json
新建一个项目 day05djangopro,创建一个应用 叫app
不写子路由啦,直接写根路由day05djangopro\urls.py
from django.contrib import admin
from django.urls import path
from app.views import *
urlpatterns = [
path('myrequest/',my_request),
path('admin/', admin.site.urls),
]
app\views.py
from django.shortcuts import render, httpresponse
# 请求
def my_request(request):
print(request) # 请求对象
# <wsgirequest: get '/myrequest/'>
return httpresponse('ok')
http://127.0.0.1:8000/myrequest/
打印得到的是<wsgirequest
: get ‘/myrequest/’>
wsgirequest
是什么?我们可以看一下
wsgirequest 继承 httprequest ,httprequest 再点开看一下
querydict 继承 multivaluedict,multivaluedict继承 dict字典,所以querydict 可以当成字典来用
。querydict 是一个 类字典对象。
app\views.py
from django.shortcuts import render, httpresponse
# 请求
def my_request(request):
print(request) # 请求对象
# <wsgirequest: get '/myrequest/'>
# request对象的属性和方法
print(request.method) # 请求方式,get,post...
print(request.get) # get请求的参数 <querydict: {'name': ['清风'], 'age': ['18']}>
print(request.get['name']) # 第一种方式,如果没有就会报错
print(request.get.get('name', default='匿名用户')) # 第二种方式,如果没有就会返回none或者默认值(跟字典一样dict),不会报错,推荐使用这种方式
print(request.get.getlist('name')) # 第三种,如果name有多个值,则都会获取,以列表[]的形式返回,没有数据就返回空列表[]
# print(request.post) # post请求的参数 <querydict: {}>
# print(request.post.get('name', default='匿名用户')) # 也是一样的
print(request.path) # 路径,就是我们写的路由 /myrequest/
print(request.get_full_path()) # 整个路径 /myrequest/?age=18&name=%e6%b8%85%e9%a3%8e&name=%e5%be%ae%e6%b3%ab
return httpresponse('ok')
http://127.0.0.1:8000/myrequest/?age=18&name=清风&name=微泫
此外还有…
# 请求
def my_request(request):
print(request) # 请求对象
print(request.cookies) # cookie 会话技术
# {'csrftoken': 'lvqayumdgiemswhyomzxc1mspaoss35j'}
print(request.session) # session 会话
# <django.contrib.sessions.backends.db.sessionstore object at 0x0000023890cb3890>
print(request.files) # 文件,前端上传的文件对象
print(request.meta['remote_addr']) # 客户端的ip地址
return httpresponse('ok')
day05djangopro\urls.py
path('myresponse/', my_response),
app\views.py
from django.http import jsonresponse
from django.shortcuts import render, httpresponse, redirect, reverse, httpresponseredirect
def my_response(request):
# 1. 返回字符串:企业项目中使用很少
# return httpresponse('ok')
# 2. 返回模板:前后端不分离的时候使用
# return render(request, 'index.html', {'key1': 'value1', 'key2': 'value2'})
# 3. 重定向: 页面跳转用的,路径的跳转
# redirect 和 httpresponseredirect是一样的
# return redirect("https://blog.csdn.net/weixin_59633478/category_12401835.html")
# return redirect("/request/")
# return httpresponseredirect("/request/")
# redirect(reverse("命名空间:userdetail", args=(2,)))
# return redirect(reverse("app:userdetail", kwargs={'uid': 2}))
# 4. 返回json: 前后端分离的情况使用
return jsonresponse({
'data': 123
})
# 请求
def my_request(request):
print(request) # 请求对象
# <wsgirequest: get '/myrequest/'>
# request对象的属性和方法
# print(request.method) # 请求方式,get,post...
# print(request.get) # get请求的参数 <querydict: {'name': ['清风'], 'age': ['18']}>
# print(request.get['name']) # 第一种方式,如果没有就会报错
# print(request.get.get('name', default='匿名用户')) # 第二种方式,如果没有就会返回none或者默认值(跟字典一样dict),不会报错,推荐使用这种方式
# print(request.get.getlist('name')) # 第三种,如果name有多个值,则都会获取,以列表[]的形式返回,没有数据就返回空列表[]
# # print(request.post) # post请求的参数 <querydict: {}>
# # print(request.post.get('name', default='匿名用户')) # 也是一样的
#
# print(request.path) # 路径,就是我们写的路由 /myrequest/
# print(request.get_full_path()) # 整个路径 /myrequest/?age=18&name=%e6%b8%85%e9%a3%8e&name=%e5%be%ae%e6%b3%ab
print(request.cookies) # cookie 会话技术
# {'csrftoken': 'lvqayumdgiemswhyomzxc1mspaoss35j'}
print(request.session) # session 会话
# <django.contrib.sessions.backends.db.sessionstore object at 0x0000023890cb3890>
print(request.files) # 文件,前端上传的文件对象
print(request.meta['remote_addr']) # 客户端的ip地址
return httpresponse('ok')
其实render返回的也是httpresponse,只不过我们通过render_to_string方法将我们模板也就是html和内容加进去,在它内部会将html内容、模板语法 和 发过去的数据 进行结合做渲染,渲染之后得到的content其实是一个可能很长的html数据,所以返回的也是一个字符串。
app\views.py
def my_response(request):
response = httpresponse('ok')
response.content = 'hello'
response.status_code = 400
return response
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论