【问题标题】:Django URL regex matches correctly with GET but not POSTDjango URL 正则表达式与 GET 正确匹配,但与 POST 不匹配
【发布时间】:2015-08-25 06:22:40
【问题描述】:

我正在开发一个 web 应用程序,让您可以在给定日期轮询 Django 后端以获取 IRC 日志。我的网址结构是:

example.tld/weblogs/<example channel>/dl/<example date>.<example format>

用户可以通过 GET 查询以下 url 方案:

example.tld/weblogs/<example channel>/

获取最后 100 行 IRC 数据。

当请求是显式 GET 时,我的 URL 匹配文件正确路由到正确的视图 (views.download),但是我无法仅在 example.tld/weblogs/<example channel>/dl/ 上执行 POST 并将 POST 后的表单数据发送到与显式 GET 相同的视图。

例如,如果用户键入显式 URL example.tld/weblogs/foo/dl/2015-01-01.json,请求将被正确路由到正确的视图。 但是,如果表单向example.tld/weblogs/foo/dl/ 提交 POST,则 POST 请求将发送到处理对 example.tld/weblogs/foo 的请求的视图(在这种情况下)。

项目urls.py:

from django.conf.urls import include, url
from django.contrib import admin
from log import views

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^weblog/', include('log.urls')),
]

log.urls:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.weblogs, name='weblogs'),
    url(r'^(?P<channel>[^, ]{1,200})/$', views.channel, name="channel"),
    url(r'^(?P<channel>[^, ]{1,200})/dl/(?P<date>[0-9]{4}-[0-9]{2}-[0-9]{2}).(?P<format>(html|json|yaml|xml))', views.download),
]

GET 请求如下所示:

"GET /weblog/example/dl/2015-08-20.yaml/ HTTP/1.1" 200 4621

POST 请求如下所示:

"POST /weblog/example/dl/ HTTP/1.1" 200 74

【问题讨论】:

  • 正则表达式模式按预期工作,问题出在其他地方。

标签: python regex django http


【解决方案1】:

在您的正则表达式中,[^, ] 匹配除逗号和空格之外的任何字符,包括正斜杠。

要排除正斜杠,请将其更改为 [^,/ ]。或者,像[-\w] + 这样的东西可能是合适的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多