最简函数视图是接收request参数并返回HttpResponse实例的Python函数;需导入HttpResponse,返回HttpResponse("内容", content_type="text/plain"),不可直接return字符串。

怎么写一个最简函数视图并返回文本
函数视图本质就是 Python 函数,只要接收一个 request 参数、返回一个 HTTP 响应对象就行。Django 不强制你用类,函数够用就别绕弯。
常见错误是直接 return "hello" 或 print() —— 这会报 TypeError: 'str' object is not callable,因为视图必须返回 HttpResponse 实例。
- 用
from django.http import HttpResponse导入响应类 - 函数第一个参数固定叫
request(名字不能改,Django 按位置传) - 返回
HttpResponse("内容"),字符串会自动设为text/html类型 - 如果想返回纯文本,加
content_type="text/plain"参数,避免浏览器误解析
from django.http import HttpResponse
def hello_view(request):
return HttpResponse("Hello, world!", content_type="text/plain")
怎么让函数视图处理 GET/POST 请求分支
函数视图不自动区分请求方法,得手动判断 request.method。很多人漏掉 else 分支或忘记处理非预期方法,结果 POST 请求进来却走 GET 逻辑,或者 405 错误没人捕获。
典型场景:登录表单提交、搜索框提交、API 简单接口。
强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该
-
request.method是大写字符串,比如"GET"或"POST" - 务必检查
if request.method == "POST":,别写成=或忽略大小写 - 对非支持方法,建议显式返回
HttpResponseNotAllowed(["GET", "POST"]),比默认 404 更准确 - POST 数据从
request.POST取(表单),request.body取原始字节(如 JSON)
from django.http import HttpResponse, HttpResponseNotAllowed
def login_view(request):
if request.method == "GET":
return HttpResponse("请提交登录表单")
elif request.method == "POST":
username = request.POST.get("username")
return HttpResponse(f"欢迎,{username}")
else:
return HttpResponseNotAllowed(["GET", "POST"])
为什么 HttpResponse 返回中文会乱码
不是 Django 问题,是 HTTP 响应头没声明编码。浏览器默认按 ISO-8859-1 解析,遇到 UTF-8 中文就显示小方块或问号。
根本原因是 HttpResponse 默认不带 charset,即使你传的是 UTF-8 字符串。
- 最稳方案:显式指定
content_type,例如content_type="text/html; charset=utf-8" - 别依赖
settings.py的DEFAULT_CHARSET—— 它只影响模板渲染,不影响HttpResponse构造 - 如果用
render()就不用操心,它内部已处理 charset;但纯HttpResponse必须自己写 - 注意:Windows 记事本保存 .py 文件时选“UTF-8 无 BOM”,否则源码里中文可能被当乱码读入
什么时候该换用 render() 而不是 HttpResponse
只要返回 HTML 页面,几乎都应该用 render()。硬拼 HTML 字符串不仅难维护,还容易 XSS、编码、上下文变量缺失等问题。
典型踩坑:在 HttpResponse 里用 f"<h1>{name}</h1>" 渲染用户输入,结果被注入 script 标签;或者忘了转义引号导致 HTML 结构崩坏。
-
render()自动使用模板引擎,做 HTML 转义、上下文合并、charset 设置 - 需要传数据给模板?第二个参数是字典,比如
{"title": "首页"} - 路径写相对模板目录的子路径,比如
"blog/index.html"(对应templates/blog/index.html) - 如果只是返回 JSON,用
JsonResponse,别用HttpResponse(json.dumps(...))手动拼
from django.shortcuts import render
def blog_list(request):
posts = [{"title": "第一篇"}, {"title": "第二篇"}]
return render(request, "blog/list.html", {"posts": posts})
事情说清了就结束。函数视图看着简单,但 method 判断、编码设置、响应类型选择这三点,线上出问题八成栽在这儿。

















