问题标签 [django-middleware]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1852 浏览

django - 使用多主机中间件测试 django 页面

背景:我正在使用中间件django-multihost(http://effbot.org/zone/django-multihost.htm) 允许我的单个 django 应用程序响应来自同一项目的不同主机名。中间件根据HTTP请求头 改变ROOT_URLCONF(即哪个文件)。urls.pyHost:

这很好用,但我想编写一些简单的集成测试来检查页面是否正确加载。下面是一个基本测试示例,用于检查/trends页面是否加载以及是否包含“今日趋势”文本:

问题是,这总是使用默认的 ROOT_URLCONF 加载,而不是中间件调用的那个。如果我明确地将主机名放入 url 中,则无关紧要client.get("http://secondarysite/trends")

如何使用 django 测试客户端在其他虚拟站点上进行测试?我想在测试中调用中间件,以便测试该逻辑。但是如果我需要我会在测试期间做一些像设置 ROOT_URLCONF 这样的骇人听闻的事情,但我不知道该怎么做。

0 投票
3 回答
5171 浏览

django - Django:创建/修改请求对象

我正在尝试构建一个 URL 别名应用程序,该应用程序允许用户为其网站中的现有 URL 创建别名。

我正在尝试通过中间件来执行此操作,其中request.META['PATH_INFO']检查了别名的数据库记录:

但是,要使其正常工作,(至少)将 PATH_INFO 更改为目标路径至关重要。

现在有一些片段允许开发人员创建测试请求对象(http://djangosnippets.org/snippets/963/http://djangosnippets.org/snippets/2231/),但这些声明它们的目的是测试目的。

当然,这些片段可能适合在实时环境中使用,但我对 Django 请求处理的了解太不成熟,无法评估这一点。

0 投票
1 回答
691 浏览

python - Django:在中间件中检索会话或 cookie

我可以在中间件中获取当前会话或 cookie 吗?

我试过了,但我得到了:

0 投票
4 回答
14600 浏览

django - 响应发送到客户端后在 Django 中执行代码

在我的 Django 应用程序中,我想跟踪是否已成功向客户端发送响应。我很清楚,在 HTTP 这样的无连接协议中没有“无懈可击”的方式来确保客户端已收到(并显示)响应,因此这不是关键任务功能,但我仍然想在最晚可能的时间。响应不会是 HTML,因此来自客户端的任何回调(使用 Javascript 或 IMG 标记等)都是不可能的。

我能找到的“最新”钩子是在中间件列表的第一个位置添加一个实现 process_response 的自定义中间件,但据我了解,这是在构建实际响应并将其发送到客户端之前执行的。响应成功发送后,Django 中是否有任何钩子/事件来执行代码?

0 投票
1 回答
474 浏览

jquery - 使用 jQuery/Javascript 在 Django 中保留显示/隐藏部分的状态

我有一个带有一些显示/隐藏部分的表格。当我在我的主页表单中按下一些按钮时,将显示不同的表单。在我编辑这些表格中的信息后,我将返回第一个表格。但是显示/隐藏部分的状态被重置。显示/隐藏操作是使用 jquery 切换完成的。这些部分的状态需要在返回时保持。所以我正在考虑将每个部分的状态存储在会话变量中。您还有其他解决方案吗?将这种行为放在单独的地方会更好还是可能会更好,例如在中间件中?

0 投票
1 回答
945 浏览

django - 如何在 django 应用程序中使用多个平面模型?

我有多个可以转换为平面页面的模型,但必须有一些额外的信息(例如,我有一个关于我们的页面,但我也有一个博客)。
但是我知道必须只有一个平面模型,因为中间件只返回平面实例并且不解析子模型。
我需要做什么?

编辑:
看来我需要改变观点。
这是当前代码:

0 投票
1 回答
1216 浏览

django - Django 消息框架、自定义中间件和 HttpResponseRedirect

注意:由于过度简化导致示例代码错误,因此重写了问题。

要对此进行测试,请确保您的主机文件中有以下设置:

在 settings.py 中,将 cookie 设置为跨子域工作:

然后我有一个看起来像这样的中间件:

我的模板包含:

您可以通过访问您的开发服务器上的http://test.local:8000(不希望有消息)和访问http://subdomain.test.local:8000(希望重定向到http://test .local:8000和一条消息)。

我确实收到了重定向,但我没有收到消息。我错过了什么还是这是一个错误?

0 投票
4 回答
72 浏览

python - 如何调用函数并形成返回对象以在我的设置文件中使用?

我有一些中间件需要一个元组(用户名......它只允许元组中的用户名通过网站的某些区域)。

我有一个 UserProfile 模型,其中包含有关每个用户的信息,我想对其进行过滤,以便它返回一个用户名元组以供此中间件使用——换句话说,设置一个变量 BETA_USERS = (dynamically-generated-tuple)。

你有什么建议来完成这个吗?

编辑:

所以,元组真的不是一个重要的细节——这里有一个例子:

通常,我会将其硬编码到设置中:

但是,我有一个包含 Beta 列的 UserProfile 模型,可以将其设置为 1。注册 Beta 的前 50 人将设置为 1,其他人设置为 0。因此,我可以通过调用模型对象上的过滤器方法:

我可以用这个奇怪的小循环把它变成一个很好的元组:

我想我真正的问题是,在我的设置文件中调用它的最佳方式是什么?

或者,换一种说法,在设置文件中分配动态创建的变量的最佳方法是什么?

0 投票
2 回答
5351 浏览

django - Django MiddleWare 订购的实用规则?

官方文档有点乱:'before' & 'after' 用于在元组中对 MiddleWare 进行排序,但在某些地方 'before'&'after' 指的是请求-响应阶段。此外,“应该是第一个/最后一个”是混合的,不清楚哪个用作“第一个”。

我确实理解其中的区别。但是对于 Django 的新手来说,这似乎很复杂。

您能否为内置的 MiddleWare 类推荐一些正确的顺序(假设我们启用了所有这些类)并且——最重要的是——解释为什么一个在其他类之前/之后?

这是列表,其中包含我设法找到的文档中的信息:

  1. UpdateCacheMiddleware
    • 在那些修改 'Vary:' SessionMiddleware, GZipMiddleware,LocaleMiddleware
  2. GZipMiddleware
    • 在任何可能更改或使用响应体的 MW 之前
    • 之后UpdateCacheMiddleware:修改“变化:”
  3. ConditionalGetMiddleware
    • 之前CommonMiddleware:使用它的“Etag:”标头时USE_ETAGS=True
  4. SessionMiddleware
    • 之后UpdateCacheMiddleware:修改“变化:”
    • 之前TransactionMiddleware:我们这里不需要交易
  5. LocaleMiddleware, 最顶层之一,仅次于SessionMiddleware、CacheMiddleware
    • 之后UpdateCacheMiddleware:修改“变化:”
    • 之后SessionMiddleware:使用会话数据
  6. CommonMiddleware
    • 在任何可能改变响应的 MW 之前(它计算 ETags)
    • 之后GZipMiddleware它不会计算压缩内容的电子标签
    • 靠近顶部:它在APPEND_SLASH或时重定向PREPEND_WWW
  7. CsrfViewMiddleware
    • 在任何假定 CSRF 攻击已被处理的视图中间件之前
  8. AuthenticationMiddleware
    • 之后SessionMiddleware:使用会话存储
  9. MessageMiddleware
    • After SessionMiddleware:可以使用基于Session的存储
  10. XViewMiddleware
  11. TransactionMiddleware
    • 在使用 DB 的 MW 之后:(SessionMiddleware可配置为使用 DB)
    • 全部*CacheMiddleWare不受影响(作为一个例外:使用自己的 DB 游标)
  12. FetchFromCacheMiddleware
    • 在那些修改'Vary:'的那些之后,如果使用它们为缓存哈希键选择一个值
    • 之后AuthenticationMiddleware可以使用CACHE_MIDDLEWARE_ANONYMOUS_ONLY
  13. FlatpageFallbackMiddleware
    • 下:最后的手段
    • 但是,使用 DB 不是问题TransactionMiddleware (是吗?)
  14. RedirectFallbackMiddleware
    • 下:最后的手段
    • 但是,使用 DB 不是问题TransactionMiddleware (是吗?)

(我会将建议添加到此列表中,以便将所有建议收集在一个地方)

0 投票
3 回答
2017 浏览

django - Django process_view 中间件导致 403 被禁止

我编写了一小部分中间件,可以捕获用户是否使用临时密码,如果是,则将他们重定向到强制他们创建新密码的页面。我的问题是,当用户登录并且不使用临时密码(即他们手动转到更改密码 URL)时,页面可以正常工作,但是当他们使用临时密码时,来自中间件的重定向会产生 403 Forbidden 页面.

在临时密码检查之后,中间件在 process_view 中做了另一件事,但这是相关代码:

请注意,可以使用像 render_to_response 之类的方法直接渲染模板来解决问题,但这会导致浏览器的 URL 无法跟随,并且无法真正退出它渲染的页面。