Django视图详解

前言

欢迎来到我的博客

个人主页:北岭敲键盘的荒漠猫-CSDN博客


一、Django视图是什么?

视图(View) 是Django处理HTTP请求的核心组件。它接收一个HttpRequest对象,处理业务逻辑,并返回一个HttpResponse对象(如网页、JSON数据、重定向等)。

1. 视图的两种写法
  • 函数视图(FBV,Function-Based Views) :用Python函数实现。

    from django.http import HttpResponsedef hello(request):return HttpResponse("Hello World!")
    
  • 类视图(CBV,Class-Based Views) :用类的方法处理请求(更结构化,适合复用)。

    from django.views import View
    from django.http import HttpResponseclass HelloView(View):def get(self, request):return HttpResponse("GET请求示例")def post(self, request):return HttpResponse("POST请求示例")
    

二、编写第一个视图:详细步骤

1. 创建视图函数

views.py中定义一个处理请求的函数:

# myapp/views.py
from django.http import HttpResponsedef home_page(request):return HttpResponse("<h1>欢迎来到我的网站!</h1>")
2. 配置URL路由

urls.py中将URL路径映射到视图:

# myproject/urls.py
from django.urls import path
from myapp import viewsurlpatterns = [path('', views.home_page, name='home'),  # 根路径指向home_page视图
]
3. 运行开发服务器
python manage.py runserver

访问 [http://127.0.0.1:8000](http://127.0.0.1:8000) 即可看到页面。


三、深入理解请求(HttpRequest)和响应(HttpResponse)

1. HttpRequest对象:包含请求的所有信息
  • 常用属性

    • request.method:请求方法(GET、POST等)
    • request.GET:GET请求的参数(字典形式)
    • request.POST:POST请求的表单数据
    • request.FILES:上传的文件
    • request.user:当前登录用户(需启用认证中间件)
  • 示例:处理GET请求参数

    def greet(request):name = request.GET.get('name', '游客')  # 获取name参数,默认值'游客'return HttpResponse(f"你好,{name}!")
    

 

2. HttpResponse对象:返回内容给浏览器
  • 常见用法

    • 返回文本:HttpResponse("文本内容")
    • 返回HTML:HttpResponse("<h1>标题</h1>")
    • 返回JSON:JsonResponse({'data': 'xxx'})
    • 重定向:HttpResponseRedirect('/new-url/')
  • 示例:返回JSON数据

    from django.http import JsonResponsedef json_example(request):data = {'status': 'success', 'message': '请求成功'}return JsonResponse(data)
    


    四、函数视图(FBV)的完整流程

    1. 处理GET和POST请求
    def contact(request):if request.method == 'POST':# 处理表单提交name = request.POST.get('name')email = request.POST.get('email')print(f"收到来自{name} ({email}) 的消息")return HttpResponseRedirect('/thanks/')  # 重定向到感谢页面else:# 显示空表单return render(request, 'contact.html')
    
    2. 渲染模板(Template)

    使用render()函数将数据传递到HTML模板:

    from django.shortcuts import renderdef article_list(request):articles = Article.objects.all()  # 假设Article是模型return render(request, 'articles/list.html', {'articles': articles})
    

    模板文件 articles/list.html

    {% for article in articles %}<h2>{{ article.title }}</h2><p>{{ article.content }}</p>
    {% endfor %}
    

    五、类视图(CBV)的用法详解

    1. 基本结构
    from django.views import View
    from django.http import HttpResponseclass MyView(View):def get(self, request):# 处理GET请求return HttpResponse("GET请求")def post(self, request):# 处理POST请求return HttpResponse("POST请求")
    
    2. 在URL中使用类视图
    # urls.py
    urlpatterns = [path('myview/', MyView.as_view(), name='my-view'),
    ]
    
    3. 类视图的优势:复用与扩展
    • 继承内置通用视图(如ListView, DetailView
    • 重写方法自定义行为:
      class ArticleListView(ListView):model = Article  # 关联模型template_name = 'articles/list.html'  # 指定模板context_object_name = 'article_list'  # 模板中使用的变量名def get_queryset(self):# 过滤已发布的文章return Article.objects.filter(status='published')
      

    六、通用视图(Generic Views)快速入门

    Django内置了处理常见场景的类视图,极大简化代码。

    概念:

    通用视图(Generic Views)是Django为解决Web开发中重复模式设计的"快捷工具包",它能让你用极简代码实现以下常见功能:

    • 显示对象列表(如商品列表、文章列表)
    • 展示单个对象详情(如用户详情页)
    • 处理表单创建/修改对象(如新建订单)
    • 日期归档页面(如按月份展示文章)
    • 删除对象前的确认操作

    传统函数视图需要手动处理数据库查询、模板渲染等细节,而通用视图通过"约定优于配置"原则自动完成这些基础工作

    1. ListView:显示对象列表
    from django.views.generic import ListViewclass BookListView(ListView):model = Book  # 自动获取所有Book对象template_name = 'books/book_list.html'  # 默认模板:books/book_list.htmlcontext_object_name = 'books'  # 模板中变量名(默认object_list)
    
    2. DetailView:显示单个对象详情
    from django.views.generic import DetailViewclass BookDetailView(DetailView):model = Book# 默认模板:books/book_detail.html# 通过URL中的pk或slug获取对象(如 /books/1/)
    
    3. 表单处理:CreateView/UpdateView
    from django.views.generic.edit import CreateView
    from django.urls import reverse_lazyclass BookCreateView(CreateView):model = Bookfields = ['title', 'author', 'price']  # 表单字段template_name = 'books/book_form.html'success_url = reverse_lazy('book-list')  # 提交成功后跳转的URL
    

    七、实际场景案例

    1. 用户登录视图
    from django.contrib.auth import authenticate, login
    from django.shortcuts import render, redirectdef login_view(request):if request.method == 'POST':username = request.POST['username']password = request.POST['password']user = authenticate(request, username=username, password=password)if user is not None:login(request, user)return redirect('home')else:return render(request, 'login.html', {'error': '用户名或密码错误'})return render(request, 'login.html')
    
    2. 文件上传
    def upload_file(request):if request.method == 'POST' and request.FILES['file']:uploaded_file = request.FILES['file']# 保存文件到服务器with open(f'uploads/{uploaded_file.name}', 'wb+') as destination:for chunk in uploaded_file.chunks():destination.write(chunk)return HttpResponse("文件上传成功!")return render(request, 'upload.html')
    

    八、常见问题与调试技巧

    1. 404错误处理
    • 使用get_object_or_404替代get
      from django.shortcuts import get_object_or_404def book_detail(request, pk):book = get_object_or_404(Book, pk=pk)return render(request, 'books/detail.html', {'book': book})
      
    2. 调试视图
    • 打印请求信息
      def debug_view(request):print("请求方法:", request.method)print("GET参数:", request.GET)print("用户:", request.user)return HttpResponse("查看控制台输出")
      
    3. 单元测试
    from django.test import TestCase, Clientclass ViewTests(TestCase):def test_home_page(self):client = Client()response = client.get('/')self.assertEqual(response.status_code, 200)self.assertContains(response, "欢迎")
    

    九、最佳实践总结

    1. 选择合适的视图类型

      • 简单逻辑用函数视图(FBV)
      • 复杂或重复逻辑用类视图(CBV)
    2. 保持视图简洁

      • 业务逻辑抽离到单独模块(如utils.py
      • 使用通用视图减少重复代码
    3. 安全注意事项

      • 始终验证用户输入
      • 使用@login_required限制敏感操作
      • 启用CSRF保护(表单中加{% csrf_token %}
    4. 性能优化

      • 使用select_relatedprefetch_related优化数据库查询
      • 缓存频繁访问的视图(如使用@cache_page装饰器)

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76089.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    【工具变量】上市公安企业社会信任数据集(2004-2023年)

    企业社会信任是衡量企业与社会之间信任度的重要指标&#xff0c;反映了企业在公众眼中的信誉和可靠性。社会信任对企业的持续发展和品牌形象有着至关重要的影响。本分享数据参考张维迎&#xff08;2002年&#xff09;的做法&#xff0c;采用中国企业家调查系统的地区信任调查数…

    Python爬取数据(二)

    一.example2包下的 1.re模块的compile函数使用 import repatternre.compile(r\d) print(pattern) 2.match的方法使用 import re patternre.compile(r\d) # m1pattern.match(one123twothree345four) #参数2&#xff1a;指定起始位置(包含),参数3&#xff1a;终止位置(包含),…

    spring之Bean的循环依赖问题、反射机制手写Spring框架、Spring IoC注解式开发

    一、Bean的循环依赖问题 1.什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 public class Husband {priv…

    状态机的基本使用

    状态机 1. 什么是状态机 1.1 场景 在业务代码中对一些业务状态进行硬编码&#xff0c;如果有一天更改了业务逻辑就需要更改代码&#xff0c;不方便进行系统扩展和维护。 if (status 状态1) {// TODO } else if(status 状态2) {// TODO } ...另外对订单状态的管理是散落在…

    22 | 如何继续提升 Go 开发技术?

    提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战营 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;。 「Go 项目开发极速…

    LLM Agents项目推荐:MetaGPT、AutoGen、AgentVerse详解

    这一部分我们将深入介绍三大备受关注的LLM Agents项目&#xff1a;MetaGPT、AutoGen和AgentVerse&#xff0c;包括它们的背景、设计思路、主要功能、技术亮点以及典型应用场景。 1. MetaGPT&#xff1a;让AI像软件工程团队一样协作 项目背景 MetaGPT由Huang et al.于2023年提…

    好数(蓝桥杯2024省赛B组)

    题目描述 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位……&#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位……&#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。 给定一个正整数 N&#xf…

    STM32单片机入门学习——第26节: [9-2] USART串口外设

    写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.08 STM32开发板学习——第26节: [9-2] USART串口外设 前言开发板说明引用解答和科普…

    【学Rust写CAD】31 muldiv255函数(muldiv255.rs,已经取消)

    源码 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…

    LLM+js实现大模型对话

    代码运行效果图&#xff1a;前提是你有一个可用的openai服务&#xff0c;然后用下面一个html页即可启动 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthd…

    用claude3.7,不到1天写了一个工具小程序(11个工具6个游戏)

    一、功能概览和本文核心 本次开发&#xff0c;不是1天干撸&#xff0c;而是在下班后或早起搞的&#xff0c;总体加和计算了一下&#xff0c;大概1天的时间&#xff08;12个小时&#xff09;&#xff0c;平常下班都是9点的衰仔&#xff0c;好在还有双休&#xff0c;谢天谢地。 …

    C++实现文件断点续传:原理剖析与实战指南

    文件传输示意图 一、断点续传的核心价值 1.1 大文件传输的痛点分析 网络闪断导致重复传输&#xff1a;平均重试3-5次。 传输进度不可回溯&#xff1a;用户无法查看历史进度。 带宽利用率低下&#xff1a;每次中断需从头开始。 1.2 断点续传技术优势 指标传统传输断点续传…

    升级 SAP S/4 HANA 之 EWM 攻略

    目录 简介 知识点 数据迁移 简介 仓库管理&#xff0c;SAP 升级不管是否启动 EWM 功能&#xff0c;评估 EWM 是必经之路&#xff0c;不仅是因为 EWM 是 SAP 主推的仓库解决方案&#xff0c;更是其功能强大而便捷&#xff0c;不管是简易仓库、复杂仓库、立体仓库、高架仓库、…

    知识表示方法之六:过程表示法(Procedural Representation)

    在人工智能的发展史中&#xff0c;关于知识的表示方法曾存在两种不同的观点。一种观点认为知识主要是陈述性的&#xff0c;其表示方法应着重将其静态特性&#xff0c;即事物的属性以及事物间的关系表示出来&#xff0c;称以这种观点表示知识的方法为陈述式或说明式表示法&#…

    绿色供应链管理体系认证:开启企业可持续发展的绿色新篇章

    在全球“双碳”目标驱动下&#xff0c;绿色供应链管理已成为企业高质量发展的核心议题。据国际权威机构预测&#xff0c;到2030年&#xff0c;绿色供应链相关市场规模将突破万亿美元。在此背景下&#xff0c;绿色供应链管理体系认证不仅是企业合规的“通行证”&#xff0c;更是…

    MATLAB如何打印一个桃心形状

    在MATLAB中打印一个桃心形状&#xff0c;您可以使用绘图函数来创建一个心形图案。以下是一个简单的例子&#xff0c;展示了如何使用MATLAB绘制一个心形&#xff1a; 定义心形的参数方程&#xff1a;心形可以通过一组参数方程来描述。 使用MATLAB的绘图函数&#xff1a;plot函…

    前端知识(vue3)

    1.Vue3 1.1 介绍 Vue&#xff08;读音 /vjuː/, 类似于 view&#xff09;是一款用于构建用户界面的渐进式的JavaScript框架 官网&#xff1a;https://cn.vuejs.org 1.2 常见指令 指令&#xff1a;指的是HTML 标签上带有 v- 前缀的特殊属性&#xff0c;不同指令具有不同含义…

    状态机思想编程

    1. LED流水灯的FPGA代码 一个使用状态机思想来实现LED流水灯的FPGA代码 这个例子采用VHDL编写 VHDL代码示例&#xff1a; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;entity led_flowing isPort ( clk …

    网络安全小知识课堂(五)

    病毒与蠕虫&#xff1a;你的电脑为何会 “生病” 和 “传染”&#xff1f; 引言 你是否见过这样的场景&#xff1a;电脑突然弹窗广告暴增&#xff0c;文件莫名消失&#xff0c;甚至整个公司网络集体瘫痪&#xff1f;这些症状背后&#xff0c;可能是 ** 病毒&#xff08;Virus…

    RVOS-1.环境搭建与系统引导

    0.环境搭建 riscv-operating-system-mooc: 开放课程《循序渐进&#xff0c;学习开发一个 RISC-V 上的操作系统》配套教材代码仓库。 mirror to https://github.com/plctlab/riscv-operating-system-mooc 在 Ubuntu 20.04 以上环境下我们可以直接使用官方提供的 GNU工具链和 QEM…