request 的属性本身也是对象,它们有自己的属性和方法。
我们可以把 request 想象成一个“盒子”,盒子里装的不全是“基本数据”(如字符串、数字),还有很多是“其他对象”。
📦 常见的 request 一级属性及其“子属性”(即“属性的属性”)
request.xxx | 类型 | 是否有“子属性”? | 示例说明 |
|---|---|---|---|
request.path_info | str 字符串 | ❌ 无“属性”,但有方法如 .startswith(), .endswith(), .split() | 它是基本类型 |
request.GET | QueryDict 对象 | ✅ 有属性和方法 | .get(), .getlist(), .dict() |
request.POST | QueryDict 对象 | ✅ 有属性和方法 | 同上 |
request.META | dict 字典 | ✅ 有键值对(可视为“属性”) | request.META['HTTP_USER_AGENT'] |
request.session | SessionStore 对象 | ✅ 有属性和方法 | request.session['key'], .get(), .set_expiry() |
request.user | User 或 AnonymousUser 对象 | ✅ 有属性 | request.user.username, .is_authenticated, .is_staff |
request.FILES | MultiValueDict 对象 | ✅ 有方法 | .get('file') |
request.body | bytes 字节串 | ❌ 无属性,但有方法 | .decode('utf-8') |
🔍 举几个具体例子
1. request.GET 是一个对象,它有“子属性”/方法
# URL: /search/?q=python&tag=web
request.GET.get('q') # 'python' ← 方法
request.GET['tag'] # 'web' ← 按键取值
request.GET.dict() # {'q': 'python', 'tag': 'web'} ← 方法
2. request.META 是一个字典,可以取“子键”
request.META['REMOTE_ADDR'] # 客户端 IP 地址
request.META['HTTP_USER_AGENT'] # 浏览器信息
request.META['SERVER_NAME'] # 服务器域名
3. request.user 是一个用户对象
request.user.username # 用户名
request.user.is_authenticated # 是否已登录(True/False)
request.user.is_staff # 是否是管理员
request.user.email # 邮箱
4. request.session 也是一个对象
request.session['app'] # 取值
request.session.get('app') # 更安全地取值
request.session.cycle_key() # 方法:更换 session key
图解:request 的“层级结构”(简化版)
request
├── path_info → '/api/users/' (str)
├── method → 'GET' (str)
├── GET → QueryDict 对象
│ ├── get() → 方法
│ └── dict() → 方法
├── POST → QueryDict 对象
├── META → dict
│ ├── 'REMOTE_ADDR' → '192.168.1.1'
│ └── 'HTTP_USER_AGENT' → 'Chrome/123'
├── session → Session 对象
│ └── 'app' → {'id': 1, 'name': 'Tom'}
├── user → User 对象
│ ├── username → 'tom'
│ └── is_authenticated → True
└── FILES → 文件上传对象
总结
| 问题 | 回答 |
|---|---|
request.path_info.startswith(...) 是什么意思? | 判断请求路径是否以某个字符串开头,是 字符串方法,常用于中间件放行 API 或静态资源。 |
request 的一级属性下面还有属性吗? | ✅ 有! 很多属性本身是“对象”或“字典”,它们有自己的属性和方法。比如 request.user.username、request.META['REMOTE_ADDR']、request.GET.get() 等。 |
| 如何理解这种“属性的属性”? | 把 request 当作一个容器,里面装的不只是值,还有“功能对象”(如 session、user、GET/POST),它们可以进一步展开使用。 |
🧠 建议:在开发时,可以使用 print() 或 logging 调试这些结构:
import logging
logger = logging.getLogger(__name__)
def my_view(request):
logger.info(f"路径: {request.path_info}")
logger.info(f"用户: {request.user.username}")
logger.info(f"IP: {request.META.get('REMOTE_ADDR')}")
logger.info(f"GET参数: {request.GET.dict()}")
return HttpResponse("OK")
这样能更直观地看到 request 的完整结构。
3万+

被折叠的 条评论
为什么被折叠?



