视图函数是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。这个视图函数代码一般约定是放置在项目或应用程序目录中的名为views.py的文件中。
http请求中产生两个核心对象:
1、http请求---->HttpRequest对象,用户请求相关的所有信息(对象)
2、http响应---->HttpResponse对象,响应字符串
视图函数中我们用到的request,就是HttpRequest对象。HttpResponse(),就是HttpResponse对象,它向http请求响应了一段字符串。
视图函数,就是围绕着HttpRequest和HttpResponse这两个对象进行的。
HttpRequest代表一个来自uesr-agent的HTTP请求。
大多重要的请求信息都是作为HttpRequest 对象的属性出现(see Table H-1). 除了session外,其他所有属性都是只读的。
HttpRequest对象的属性:
Attribute | Description |
---|---|
path | 请求页面的全路径,不包括域名—例如, “/music/bands/the_beatles/”。 |
method | 请求中使用的HTTP方法的字符串表示。全大写表示。例如:if request.method == ‘GET’: do_something() elif request.method == ‘POST’: do_something_else() |
GET | 包含所有HTTP GET参数的类字典对象。参见QueryDict 文档。 |
POST | 包含所有HTTP POST参数的类字典对象。参见QueryDict 文档。服务器收到空的POST请求的情况也是有可能发生的。也就是说,表单form通过HTTP POST方法提交请求,但是表单中可以没有数据。因此,不能使用语句if request.POST来判断是否使用HTTP POST方法;应该使用if request.method == “POST” (参见本表的method属性)。注意: POST不包括file-upload信息。参见FILES属性。 |
REQUEST | 为了方便,该属性是POST和GET属性的集合体,但是有特殊性,先查找POST属性,然后再查找GET属性。借鉴PHP’s $_REQUEST。例如,如果GET = {“name”: “john”} 和POST = {“age”: ‘34’},则 REQUEST[“name”] 的值是"john", REQUEST[“age”]的值是"34".强烈建议使用GET and POST,因为这两个属性更加显式化,写出的代码也更易理解。 |
COOKIES | 包含所有cookies的标准Python字典对象。Keys和values都是字符串。参见第12章,有关于cookies更详细的讲解。 |
FILES | 包含所有上传文件的类字典对象。FILES中的每个Key都是标签中name属性的值. FILES中的每个value 同时也是一个标准Python字典对象,包含下面三个Keys:filename: 上传文件名,用Python字符串表示content-type: 上传文件的Content typecontent: 上传文件的原始内容注意:只有在请求方法是POST,并且请求页面中有enctype="multipart/form-data"属性时FILES才拥有数据。否则,FILES 是一个空字典。 |
META | 包含所有可用HTTP头部信息的字典。 例如:CONTENT_LENGTHCONTENT_TYPEQUERY_STRING: 未解析的原始查询字符串REMOTE_ADDR: 客户端IP地址REMOTE_HOST: 客户端主机名SERVER_NAME: 服务器主机名SERVER_PORT: 服务器端口META 中这些头加上前缀HTTP_最为Key, 例如:HTTP_ACCEPT_ENCODINGHTTP_ACCEPT_LANGUAGEHTTP_HOST: 客户发送的HTTP主机头信息HTTP_REFERER: referring页HTTP_USER_AGENT: 客户端的user-agent字符串HTTP_X_BENDER: X-Bender头信息 |
user | 是一个django.contrib.auth.models.User 对象,代表当前登录的用户。如果访问用户当前没有登录,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你可以通过user的is_authenticated()方法来辨别用户是否登录:if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users.只有激活Django中的AuthenticationMiddleware时该属性才可用关于认证和用户的更详细讲解,参见第12章。 |
session | 唯一可读写的属性,代表当前会话的字典对象。只有激活Django中的session支持时该属性才可用。 参见第12章。 |
raw_post_data | 原始HTTP POST数据,未解析过。 高级处理时会有用处。 |
**1、request.path:**这个主要是用来获取访问文件路径
from django.shortcuts import render,HttpResponse
def index(request):
print(request.path) 不含参数
print(request.get_full_path()) 含参
return render(request, index.html )
request.path的结果是该请求路径不包含参数
request.get_full_path()的结该请求路径包含参数
**2、request.method属性:**获取请求中使用的HTTP方式(POST/GET)
from django.shortcuts import render,HttpResponse
def index(request):
print(request.method)
return render(request, index.html )
**4、request.GET,**获取HTTP GET方式请求传参,的参数(字典类型)
from django.shortcuts import render,HttpResponse
def index(request):
print(request.GET)
return render(request, index.html )
对于HttpRequest 对象来说,是由Django自动创建, 但是,HttpResponse对象就必须我们自己创建。每个View方法必须返回一个HttpResponse对象。
HttpResponse类在django.http.HttpResponse
一般地, 你可以通过给HttpResponse的构造函数传递字符串表示的页面内容来构造HttpResponse对象:
response=HttpResponse('new reponse')
也可以给HttpResponse传递一个iterator作为参数,而不用传递硬编码字符串。 如果你使用这种技术, 下面是需要注意的一些事项:
· iterator应该返回字符串.
· 如果HttpResponse使用iterator进行初始化,就不能把HttpResponse实例作为filelike 对象使用。这样做将会抛出异常。
将构造的HttpResponse对象作为Header
response=HttpResponse('new reponse')
response.set_cookie(key=ip, value=time_1)
HttpResponse子类:
Class | Description |
---|---|
HttpResponseRedirect | 构造函数接受单个参数:重定向到的URL。可以是全URL (e.g., ‘http://search.yahoo.com/’)或者相对URL(e.g., ‘/search/’). 注意:这将返回HTTP状态码302。 |
HttpResponsePermanentRedirect | 同HttpResponseRedirect一样,但是返回永久重定向(HTTP 状态码 301)。 |
HttpResponseNotModified | 构造函数不需要参数。Use this to designate that a page hasn’t been modified since the user’s last request. |
HttpResponseBadRequest | 返回400 status code。 |
HttpResponseNotFound | 返回404 status code. |
HttpResponseForbidden | 返回403 status code. |
HttpResponseNotAllowed | 返回405 status code. 它需要一个必须的参数:一个允许的方法的list (e.g., [‘GET’,‘POST’]). |
HttpResponseGone | 返回410 status code. |
HttpResponseServerError | 返回500 status code. |
render(request, template_name, context)
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的HttpResponse对象。
def index(request):
context = {
blog_index :blog_index,
}
return render(request, index.html ,context)
参数:
request: 用于生成响应的请求对象。
template_name:要使用的模板的完整名称,可选的参数
context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
status:响应的状态码。默认为200。
render方法主要是将从服务器提取的数据,填充到模板中,然后将渲染后的html静态文件返回给浏览器。这里一定要注意:render渲染的是模板。
redirect的参数可以是:
一个模型:将调用模型的get_absolute_url() 函数
一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
一个绝对的或相对的URL,将原封不动的作为重定向的位置。
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
示例:
将调用具体ORM对象的get_absolute_url()方法来获取重定向的URL,
from django.shortcuts import redirect
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object) # object指的是视图函数
传递一个视图的名称,可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL:
def my_view(request):
...
return redirect(some-view-name, foo= bar )
传递要重定向的一个硬编码的URL:
def my_view(request):
...
return redirect( ‘/some/url/’ ) # 完整的url
也可以是一个完整的URL:
def my_view(request):
...
return redirect( ‘https://www.baidu.com/’ )
默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:
301永久重定向是一种非常重要的“自动转向”技术,是网址重定向最为可行的一种办法。当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。
ef my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object, permanent=True)
第一,假如render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会
第二,如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射函数,就会执行对应的映射函数。
常见错误状态码: https://blog.csdn.net/qq_24739457/article/details/83989222
https://blog.csdn.net/csdn1844295154/article/details/78980174