Django之视图函数总结

Django之视图函数总结

HttpRequest与HttpResponse

http请求中产生两个核心对象:

HttpRequest对象:用户请求相关的所有信息(对象)

HttpResponse对象:响应字符串

HttpRequest对象的属性和方法:

request.path       # 获取访问文件路径

request.method   #获取请求中使用的HTTP方式(POST/GET)

request.body      #含所有请求体信息 是bytes类型

request.GET        #GET请求的数据(类字典对象)  请求头中的url中?后面拿值
request.POST     # POST请求的数据(类字典对象) 请求体里拿值

request.COOKIES     #包含所有cookies的标准Python字典对象;keys和values都是字符串。

request.FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中
                 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:

                 filename:      上传文件名,用字符串表示
                 content_type:   上传文件的Content Type
                 content:       上传文件的原始内容

request.user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
                 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
                 可以通过user的is_authenticated()方法来辨别用户是否登陆:
                 if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
                 时该属性才可用

request.session:      唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用

request.GET.get(‘name‘)    拿到GET请求里name的值

如果某个键对应有多个值,则不能直接用get取值,需要用getlist,如:

request.POST.getlist("hobby")

请求url:http://127.0.0.1:8000/index.html/23?a=1

request.path : 请求路径
       request.path结果为:/index.html/23

request.get_full_path()
       request.get_full_path()结果为:/index.html/23?a=1

键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:request.POST.getlist("hobby")

  

  

HttpResponse对象的属性和方法:

对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。
HttpResponse类在django.http.HttpResponse

在HttpResponse对象上扩展的常用方法:

页面渲染:(返回一个页面)
render()(推荐)
render_to_response()

页面跳转:()
redirect("路径")

locals():可以直接将函数中所有的变量传给模板

  

render 函数

render方法主要是将从服务器提取的数据,填充到模板中,然后将渲染后的html静态文件返回给浏览器,这里一定要注意:render渲染的是模板。

render方法的作用:将指定页面渲染后返回给浏览器。

数据主要有两部分:

给定的模板:html文件

给定的上下文字典:需要填充到html文件的变量

render()的格式:

render(request, template_name[, context])
参数:
     request: 用于生成响应的请求对象。

     template_name:要使用的模板的完整名称,可选的参数

     context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

     content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。

     status:响应的状态码。默认为200。

 

使用示例 

urls.py

from django.contrib import admin
from django.urls import path
from blog import  views

urlpatterns = [
path(‘show_time/‘,views.show_time),
]

view.py

from django.shortcuts import render,HttpResponse
import time

def show_time(req):
    t=time.ctime()
    return render(req,"index.html",{"time":t})

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Now {{ time }}</h1>
</body>
</html>

巧用locals()

我们可以把变量填充给html文件,如果变量很多,我们在键值对后面添加就会很麻烦。

所以我们把所有变量都封装到locals下,包括request下的属性!!!

注意:在html文件中,使用的变量名必须和view.py文件下的对应视图函数里面的变量名相同才能使用。

现在修改view.py文件下,

retuen render(req,"index.html",{"time":t})

  

return render(req,"index.html",locals())

  

redirect 函数

参数可以是:

一个模型:将调用模型的get_absolute_url() 函数
一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
一个绝对的或相对的URL,将原封不动的作为重定向的位置。
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。

  

传递一个对象
将调用get_absolute_url() 方法来获取重定向的URL:
from django.shortcuts import redirect
def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object)

传递一个视图的名称
可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL: 
def my_view(request):
    ...
    return redirect(‘some-view-name‘, foo=‘bar‘)

传递要重定向的一个硬编码的URL
def my_view(request):
    ...
    return redirect(‘/some/url/‘)

也可以是一个完整的URL:
def my_view(request):
    ...
    return redirect(‘http://example.com/‘)

默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:
def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object, permanent=True) 

  

跳转应用

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="http://127.0.0.1:8080/register.html/" method="get" >
<p>文本框:<input type="text" name="username" placeholder="姓名"></p>
<p>密码框:<input type="password" name="passwd" placeholder=" 密码"></p>
<p>单选框:男<input type="radio" name="gender" value="men">女<input type="radio" name="gender" value="women"></p>
<p>复选框:音乐<input type="checkbox" name="hobby" value="music">电影<input type="checkbox" name="hobby" value="movice"></p>
<p>下拉输入项:
<select name="生日">
    <option value="1991">1991</option>
    <option value="1992">1992</option>
    <option value="1993">1993</option>
</select>
</p>
<p>提交按钮:<input type="submit"></p>
<p>重置按钮:<input type="reset"></p>

</form>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form>
    <p>用户名:<input type="text"></p>
    <p>密码:<input type="password"></p>
    <p><input type="submit" value="登陆"></p>
</form>
</body>
</html>

urls.py

from django.contrib import admin
from django.urls import path
from blog import  views

urlpatterns = [
    path("register.html/",views.register),
    path("login/",views.login),
]

view.py

from django.shortcuts import render,HttpResponse,redirect

def register(req):
    user=req.GET.get(‘username‘)
    if user=="admin":
        return redirect("/login/")
    return render(req,"register.html")

def login(req):
    return render(req,"login.html")

现在访问http://127.0.0.1:8080/register.html

提交成功后进行判读

如果用户为admin

则跳转到http://127.0.0.1:8080/login/

如果用户名不为admin

则重新返回这个页面

第一,render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会.

第二,如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射函数,就会执行对应的映射函数。

  

原文地址:https://www.cnblogs.com/-wenli/p/10401746.html

时间: 2024-10-11 11:35:11

Django之视图函数总结的相关文章

Django 定义视图函数

Django 定义视图函数 视图函数主要在Django项目内app下的 views.py 文件内定义 # 调用模块方法 from django.shortcuts import render,HttpResponse,redirect def func() # 包含所有的请求数据 .... # 返回字符串内容 return HttpRespon('字符串') # 返回数据 render(request,'模板路径') 返回html模板内容 return render(request,'index

Django的视图函数中一些没有用过的小点

1.request对象 print("返回用户访问的url,但是不包括域名",request.path_info) print("返回请求的方法,全大写",request.method) print("返回HTTPde GET参数的类的字典对象",request.GET) print("返回HTTPde POST参数的类的字典对象", request.POST) print("请求体",request.bo

django之视图函数

视图函数接收Web请求并返回Web响应. 请求对象 urls.py from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), re_path(r'index/',views.index), re_path(r'^$',views.index) ] views.py from django.shortcuts import render,

Django中非视图函数获取用户对象

今天遇到了一个问题:在Django中怎么从非视图函数中获取用户对象?怎么保证不同的请求获取到不同的用户对象? 平常我们获取用户对象使用的是: request.user 不得不说,这确实很方便. 但是,如果现在有两个类: # 注意,这两个类可以不在同一个py文件中 # 视图类 class Index(View): """ 功能集中调用 """ def post(self, request): return HttpResponse('你好!') #

django之视图函数的介绍

request-path 路径 request.get_full_path() 路径+数据 render(request,"html") 推荐 render_to_response("html") 有时会出现意想不到的bug locals() 局部变量全部传给模板 redirect("路径") 页面跳转 redirect() 跳转 render() 不跳转 原文地址:https://www.cnblogs.com/jintian/p/111355

Django基础三之视图函数

Django基础三之视图函数 本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项

03.Django基础三之视图函数

一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项目目录下面.除此之外没有更多的要求了--可以说"没有什么神奇的地方".为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为view

view 视图函数

一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项目目录下面.除此之外没有更多的要求了——可以说“没有什么神奇的地方”.为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的

django RESTful研究一第一个测试例子(用序列化器编写原生的Django视图函数)

让我们看看通过 Serializer 类怎样来编写 API 的视图函数,现在我们不会使用 REST 框架中的特性,仅仅写原生的Django视图函数. 一.我们创建一个 HttpResponse 的子类,用来将任何数据转换成 JSON格式. 编辑snippets/views.py,如下: from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt from rest_framew