python - django request.POST 包含<无法解析>

标签 python django apache django-views mod-python

我有一个 Django 表单来获取用户名和密码。当用户发布数据时,我看到发布字典包含以下内容(回溯), 追溯(最近一次通话最后一次):

File "/usr/lib/python2.4/site-packages/django/core/handlers/base.py", line 111, in get_response
response = callback(request, *callback_args, **callback_kwargs)

File "/usr/lib/python2.4/site-packages/django/views/decorators/csrf.py", line 39, in wrapped_view
resp = view_func(*args, **kwargs)

File "/usr/lib/python2.4/site-packages/django/views/decorators/csrf.py", line 52, in wrapped_view
return view_func(*args, **kwargs)

File "/public/gdp/trunk/src/ukl/lis/process/utils/error_handler.py", line 17, in __call__
return self.function(*args, **kwargs)

File "/usr/lib/python2.4/site-packages/django/views/decorators/cache.py", line 66, in _cache_controlled
response = viewfunc(request, *args, **kw)

File "/public/gdp/trunk/src/ukl/lis/process/authentication/views.py", line 530, in process_login
form = loginForm(request.POST)

File "/usr/lib/python2.4/site-packages/django/core/handlers/modpython.py", line 101, in _get_post
self._load_post_and_files()

File "/usr/lib/python2.4/site-packages/django/http/__init__.py", line 270, in _load_post_and_files
if self.META.get('CONTENT_TYPE', '').startswith('multipart'):

AttributeError: 'NoneType' object has no attribute 'startswith'

<ModPythonRequest
path:/login.html,
GET:<QueryDict: {}>,
POST:<could not parse>,
COOKIES:{'__utma': '115966011.1553834174.1346687405.1346687405.1346687045.1',
'__utmb': '115962011.4.10.1346687045',},
META:{'AUTH_TYPE': None,
'CONTENT_LENGTH': '85',
'CONTENT_TYPE': None,
'GATEWAY_INTERFACE': 'CGI/1.1',
'HTTP_ACCEPT': 'text/html, application/xhtml+xml, */*',
'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE': 'en-GB',
'HTTP_CACHE_CONTROL': 'no-cache',
'HTTP_CONNECTION': 'Keep-Alive',
'HTTP_CONTENT_LENGTH': '85',
'HTTP_COOKIE': 'flavor=desktop; sessionid=4a2f2ab6f61315493f3038338524cfc7;    tmsid=e7c921af-9cae-4f58-8825-13f9bc2ba95f; uniqid=6f69c607-6aca-4e92-a112-b83691805155; __utma=115962011.1553833174.1346687005.1346687005.1346687005.1; __utmb=115962011.4.10.1346687005; __utmz=115962011.1346687005.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=115962011',
'HTTP_HOST': 'example.com',
'HTTP_REFERER': 'http://example.com/',
'HTTP_USER_AGENT': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64;  Trident/5.0)',
'PATH_INFO': u'/login.html',
'PATH_TRANSLATED': None,
'QUERY_STRING': None,
'REMOTE_ADDR': 'xx.xx.xx.xx',
'REMOTE_HOST': None,
'REMOTE_IDENT': None,
'REMOTE_USER': None,
'REQUEST_METHOD': 'POST',
'SCRIPT_NAME': '',
'SERVER_NAME': 'example.com',
'SERVER_PORT': 443,
'SERVER_PROTOCOL': 'HTTP/1.1',
'SERVER_SOFTWARE': 'mod_python'}>

为什么 post dict 有“”,为什么 CONTENT_TYPE 没有?这可以防止我越过登录页面。

这是我的表格,

   <form method="POST">{% csrf_token %}
       <tr>
     <td><label>Email Id</label></td>
     <td>{{form.username}}</td>
     <td><label>Password</label></td>
     <td>{{form.password}}</td>
   </tr>
    <input type="submit" name="btn_login" id="btn_login" class="btn_login" value="Login" /></td>

  </form>

表格.py:

class loginForm(ModelForm):
    username = forms.CharField(max_length=50)
    password = forms.CharField(max_length=50, widget=forms.PasswordInput(attrs=  {"autocomplete":"off"}))

    class Meta:
        model = User

查看:

def login(request):
 if request.method == "POST":
   log.inof(request)
 else:
  request.session.set_test_cookie()
  form = loginForm()
  return render_to_response('login.html', {'form':form},context_instance=RequestContext(request))

注意:我还发现所有请求都仅来自移动设备,尤其是黑莓手机。似乎还有一位用户有同样的问题

编号:https://stackoverflow.com/questions/12471661/mod-python-could-not-parse-the-django-post-request-for-blackberry-and-some-andro

最佳答案

由于错误不会发生在您的开发堆栈中,只是有时会发生在生产中,我怀疑它是您的 Django 代码中的某些东西。

您是如何联系机器的?请求将发送到本地主机。您是在生产机器上运行浏览器还是在它前面有一些代理或负载平衡器?

在我看来,在您的请求到达 mod_python 之前,有些东西正在破坏您的请求,无论是代理还是错误配置的 ssl。

症状是您收到损坏的请求。问题可能出在任何地方,从您的 Python 应用程序到您端的所有 OSI 层,再到客户端的所有 OSI 层。尝试全面了解介于两者之间的所有事物并系统地排除它们。

您的 TCP/IP 堆栈似乎工作正常,否则您会看到其他请求和服务也受到影响。所以我们可以排除 session 层以下的一切。剩下表示层 (SSL) 和应用层 (HTTP)。

  1. SSL

    SERVER_PORT 是 443,这里使用 SSL。请求 header (HTTP_REFERER 等)包含有效字符串,因此 SSL 似乎可以正常工作。但我以前见过一些奇怪的困惑的 TLS session 。

  2. HTTP

    本层玩家:

    • 你的 Apache httpd
    • 您端的任何反向代理
    • 您和客户之间的任何转发代理。 REMOTE_ADDR 是否都在同一个子网中,是否有一些移动运营商的代理损坏?
    • 客户端用户代理。黑莓都坏了吗?尝试着手使用最失败的浏览器。

您的负载均衡器在哪一层运行?

似乎主要问题是 POST 请求中缺少 Content-Type header ,因此 POST 内容的 Python 表示形式上的值无法使用 pprint 完美打印,更不用说您的应用程序使用了。

忽略什么I found在 Blackberry 开发人员引用中:您是否尝试将 enctype 明确设置为 Simon suggested ?尝试改变 application/x-www-form-urlencodedmultipart/form-data

最重要的是尝试自己重现它。尝试制作 tcpdump记录这样的请求。您可以使用 wireshark 分析记录的转储.

关于python - django request.POST 包含<无法解析>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12257618/

相关文章:

Python 尝试/捕获 : simply go to next statement when Exception

python - 无法在pydev中为django项目编写代码

django - 如何从 Django Celery 恢复与 Postgres 的连接中断

apache - 对于不存在的文件,将所有请求转发到一个 index.php 文件,但“包括”index.php 本身

python - 无法反转 matplotlib 子图中的 xticks

python - 如何在不改变数据帧核心的情况下重新采样数据帧?

python - __instancecheck__ - 覆盖显示无效 - 我做错了什么?

java - Django 与 Acegi 集成

php - 切换到HTTPS后无法登录PHPmyAdmin

apache tomcat 连接器 - 网站配置