【问题标题】:Django regex url parsing to calling wrong viewDjango正则表达式url解析调用错误视图
【发布时间】:2019-10-15 04:54:31
【问题描述】:

我有一个Django 2.2 项目(使用其余框架),我需要使用以下格式的 url 调用视图函数:

/class/students?date=07092019`

我已经设置了以下 url 路由来处理这个 url:

re_path(r'^class/students%3Fdate%3D(?P<date>\w+)/$',StudentsInClassView.as_view() ,name='student')

对应的视图函数定义如下:

class StudentsInClassView(APIView):

    def get(self, request, date,format=None):

由于某种原因,每当我转到 url 时,它都会转换为

/class/students/?date=07092019

和不同的视图,带有 URL

path('class/students/',StudentsView.as_view() ,name='students')

被调用。

如果我从 URL 中删除 ?date= 并仅包含实际日期,则会按预期调用 StudentsInClassView。我已经避开了问号和等号,但这样做似乎没有什么区别。

如何让?date= slug 保留在 URL 中,因为它用于调用 StudentsInClassView?是否有不同的正则表达式可用于匹配整个 URL?

【问题讨论】:

    标签: python regex django api django-rest-framework


    【解决方案1】:

    ? 标记之后的部分称为URL Query String。您不应该将其包含在正则表达式中。相反,您可以将 url 更改为/class/students/&lt;str:date&gt;/,或者如果没有date,您可以在视图中添加一些逻辑来引发错误(但我认为这不是一个理想的解决方案,因为 URL 查询字符串不是强制性的部分网址):

    class StudentsView(...):
        def get(self, request, *args, **kwargs):
            if not 'date' in request.GET:
                raise HttpResponse("provide date", status=400)
            return super().get(request, *args, **kwargs)
    

    【讨论】:

    • 因此将 url 更改为 /class/students/&lt;str:date&gt;/ 仍将允许使用 /class/students?date=07092019 从浏览器调用视图(假设您如上所述检查日期是否存在)?跨度>
    • 不,您需要致电'/class/student/15102019/'
    • 好的,我让您的视图版本正常工作(从请求字典中获取日期),但只能通过更改路径名称中的字符来区分 class/students/ 的两个版本。当使用 /class/students/&lt;str:date&gt;/ 时,即使两个 url 具有相同的基数,如何强制调用 'student' url 而不是 'students' 视图网址?
    • 在urls.py中写url时,需要在/class/students/之前加上/class/students/&lt;str:date&gt;/,剩下的交给django处理。
    • 你可以这样处理。拥有单一视图/class/students/ 并将其用于两个目的。如果有人使用/class/students/?date=12122019 调用,则根据值request.GET['date'] 执行操作(如过滤或东西)
    猜你喜欢
    • 2011-03-20
    • 2015-07-10
    • 1970-01-01
    • 2012-08-23
    • 2016-07-30
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多