在PythonAnywhere上如何处理Django的POST请求?
在PythonAnywhere上如何处理Django的POST请求?
嘿,我来帮你解决这个问题!你遇到的两个疑问我都一一给你拆解清楚:
一、先搞定「Forbidden (Referer checking failed - no Referer.)」错误
这个报错看起来是Referer的问题,但本质是Django默认开启的CSRF保护机制在起作用,和PythonAnywhere本身的配置关系不大。解决方法很直接:
- 如果是用表单提交POST请求,一定要在
<form>标签内部添加CSRF令牌模板标签:
Django会自动生成一个隐藏的令牌字段,用来验证请求的合法性,没有这个的话就会触发你看到的Forbidden错误。<form method="POST" action="{% url 'your-target-view' %}"> {% csrf_token %} <!-- 这里放你的表单输入框、按钮等字段 --> <button type="submit">提交</button> </form> - 如果是用AJAX发送POST请求,记得在请求头里带上
X-CSRFToken字段,值可以从浏览器的csrftokenCookie中获取,或者直接从页面上的隐藏令牌字段读取,比如:const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value; fetch('/your-target-url/', { method: 'POST', headers: { 'X-CSRFToken': csrftoken, }, body: JSON.stringify(yourData) });
⚠️ 重点提醒:除非是纯测试的临时场景,绝对不要关闭Django的CSRF中间件(settings.py里的django.middleware.csrf.CsrfViewMiddleware),这会让你的站点暴露在严重的安全风险中。
二、urls.py对POST请求的处理和GET完全一样!
Django的URL路由系统只负责匹配请求的路径,不会区分请求方法(GET/POST/PUT/DELETE等)。也就是说,不管是GET还是POST请求,只要URL路径匹配上urls.py里的规则,就会转到对应的视图函数。
你需要在视图函数里自己判断请求方法,来处理不同的逻辑,比如:
from django.shortcuts import render, redirect from .forms import YourCustomForm def your_view_function(request): if request.method == 'POST': # 处理POST提交的数据 form = YourCustomForm(request.POST) if form.is_valid(): # 比如保存数据到数据库 form.save() # 处理完后跳转到成功页面 return redirect('success-page-url-name') else: # GET请求时,展示空表单 form = YourCustomForm() return render(request, 'your-template.html', {'form': form})
一些PythonAnywhere上的小提醒
- 确保你的Django项目在PythonAnywhere的WSGI配置和本地一致,特别是中间件列表(
settings.py里的MIDDLEWARE),不要不小心删掉了CSRF中间件。 - 如果还是有问题,去PythonAnywhere的Web页面里查看「Error log」,里面会有更详细的错误堆栈信息,能帮你快速定位问题根源。
备注:内容来源于stack exchange,提问作者Duncan Marshall
相关产品推荐
相关产品推荐

