Django源码cookie解读:关于中文cookie会被吞掉并截断的问题。

 最近同事负责的项目后台访问的时候会出现部分cookie被吞掉并截断的情况,情况举例如下:

 假如前台传过来的cookie为:

id=100; name=测试; token=957439858943845;
 这时传到django后台后获取到的cookie就会从name开始截断,只剩下id=100这一个cookie信息。

通过后台抓包和ngnix日志输出定位到问题出在了django这一层,我负责的项目却没有这个问题,于是查看了二者的版本,他环境上的django版本是1.5.12,而我的django版本是1.8.17,难道真的是django版本的问题?于是就换了个环境分别测试了两个版本的访问情况,果然把1.5.12升级为1.8.17后就可以正常使用cookie了。

 解决问题不能仅仅是解决,而是要搞清楚问题的原因在哪,于是我研究了一下django的两个版本源码对比,发现django1.5.12版本在处理cookie上使用了Cookie.SimpleCookie,源码对应的文件为django/django/http/cookie.py

from __future__ import absolute_import, unicode_literals

from django.utils.encoding import force_str
from django.utils import six
from django.utils.six.moves import http_cookies


# Some versions of Python 2.7 and later won't need this encoding bug fix:
_cookie_encodes_correctly = http_cookies.SimpleCookie().value_encode(';') == (';', '"\\073"')
# See ticket #13007, http://bugs.python.org/issue2193 and http://trac.edgewall.org/ticket/2256
_tc = http_cookies.SimpleCookie()
try:
    _tc.load(str('foo:bar=1'))
    _cookie_allows_colon_in_names = True
except http_cookies.CookieError:
    _cookie_allows_colon_in_names = False

if _cookie_encodes_correctly and _cookie_allows_colon_in_names:
    SimpleCookie = http_cookies.SimpleCookie
else:
    Morsel = http_cookies.Morsel

    class SimpleCookie(http_cookies.SimpleCookie):
        if not _cookie_encodes_correctly:
            def value_encode(self, val):
                # Some browsers do not support quoted-string from RFC 2109,
                # including some versions of Safari and Internet Explorer.
                # These browsers split on ';', and some versions of Safari
                # are known to split on ', '. Therefore, we encode ';' and ','

                # SimpleCookie already does the 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中间件是一种可插拔的组件,用于在请求和响应处理过程中进行预处理和后处理操作。它可以对请求进行修改、验证、记录日志等操作,并且可以在视图函数执行前后进行一些额外的处理。 下面是对Django中间件码的简要解读: 1. 中间件的定义: Django中间件是一个Python类,它实现了一组特定的方法,用于处理请求和响应。通常,一个中间件类至少需要实现`__init__`和`__call__`方法。 2. 中间件的执行顺序: Django中间件的执行顺序是按照在`MIDDLEWARE`设置中定义的顺序进行的。每个中间件都依次调用`__call__`方法,处理请求或响应。 3. 请求阶段的中间件方法: - `process_request(request)`:在视图函数执行前被调用,可以对请求进行修改或验证。 - `process_view(request, view_func, view_args, view_kwargs)`:在视图函数执行前被调用,可以对视图函数进行修改或验证。 - `process_exception(request, exception)`:在视图函数抛出异常时被调用,可以对异常进行处理或记录日志。 4. 响应阶段的中间件方法: - `process_response(request, response)`:在视图函数执行后被调用,可以对响应进行修改或处理。 5. 中间件的激活和配置: 在Django的配置文件中,可以通过`MIDDLEWARE`设置来激活和配置中间件。可以指定中间件类的路径,也可以使用Django提供的默认中间件。 以上是对Django中间件码的简要解读,如果你对某个具体的中间件或方法有更详细的问题,请告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值