Django之视图函数总结
Django之视图函数总结
HttpRequest与HttpResponse
http请求中产生两个核心对象:
HttpRequest对象:用户请求相关的所有信息(对象)
HttpResponse对象:响应字符串
HttpRequest对象的属性和方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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 <br><br>键值对的值是多个的时候,比如checkbox类型的 input 标签,select标签,需要用:<br>request.POST.getlist( "hobby" ) |
HttpResponse对象的属性和方法:
1 2 3 4 5 6 7 8 9 10 11 12 | 对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。 HttpResponse类在django.http.HttpResponse 在HttpResponse对象上扩展的常用方法: 页面渲染:(返回一个页面) render()(推荐) render_to_response() 页面跳转:() redirect( "路径" )<br><br> locals ():可以直接将函数中所有的变量传给模板 |
render 函数
render方法主要是将从服务器提取的数据,填充到模板中,然后将渲染后的html静态文件返回给浏览器,这里一定要注意:render渲染的是模板。
render方法的作用:将指定页面渲染后返回给浏览器。
数据主要有两部分:
给定的模板:html文件
给定的上下文字典:需要填充到html文件的变量
render()的格式:
1 | render(request, template_name[, context]) |
1 2 3 4 5 6 7 8 9 10 | 参数: 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文件下,
1 | retuen render(req, "index.html" ,{ "time" :t}) |
1 | return render(req, "index.html" , locals ()) |
redirect 函数
1 2 3 4 5 6 | 参数可以是: 一个模型:将调用模型的get_absolute_url() 函数 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称 一个绝对的或相对的URL,将原封不动的作为重定向的位置。 默认返回一个临时的重定向;传递permanent = True 可以返回一个永久的重定向。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 传递一个对象 将调用get_absolute_url() 方法来获取重定向的URL: from django.shortcuts import redirect def my_view(request): ... object = MyModel.objects.get(...) return redirect( object )<br><br><br> 传递一个视图的名称 可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL: def my_view(request): ... return redirect( 'some-view-name' , foo = 'bar' )<br><br><br> 传递要重定向的一个硬编码的URL def my_view(request): ... return redirect( '/some/url/' )<br><br> 也可以是一个完整的URL: def my_view(request): ... return redirect( 'http://example.com/' )<br><br> 默认情况下,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
则重新返回这个页面
1 2 3 | 第一,render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会. 第二,如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,<br>也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射<br>函数,就会执行对应的映射函数。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?