zoukankan      html  css  js  c++  java
  • 关于django.conf.urls的路由匹配问题

    1. 问题

    目前自己在写一个网站,但是在后端写好api前端请求的时候,无论如何都请求不到对应的python函数上去,于是自己就把对应的url名修改之后就可以了,具体如下:

    ## 出现问题的代码
    
    from django.conf.urls import url
    from .api import log
    
    urlpatterns = [
        url(r'queryLog', log.query_log),
        url(r'queryLogDetail', log.query_log_detail)
    ]
    

    我在前端请求了queryLogDetail的api之后,发现最终请求的函数到了query_log()函数中去了

    2. 解决

    有经验的各位如果看到了r之后这应该是正则匹配的问题,为了验证我去找了django.conf.urls的源码,如下:

    from django.urls import include, re_path
    from django.views import defaults
    
    __all__ = ['handler400', 'handler403', 'handler404', 'handler500', 'include', 'url']
    
    handler400 = defaults.bad_request
    handler403 = defaults.permission_denied
    handler404 = defaults.page_not_found
    handler500 = defaults.server_error
    
    
    def url(regex, view, kwargs=None, name=None):
        return re_path(regex, view, kwargs, name)
    

    re_path和path的作用都是一样的。只不过re_path是在写url的时候可以用正则表达式,这点大家在源码regex参数中应该可以看出来。

    看到这里大家应该知道问题是如何解决了,由于我写的代码是:

    url(r'queryLog', log.query_log),
    url(r'queryLogDetail', log.query_log_detail)
    

    解决方法一

    我请求的api是api/queryLogDetail,由于django的路由匹配是按顺序进行匹配的,也就是说当queryLog匹配成功之后系统就会认为我请求的就是queryLog这个api,从而导致我的api请求报错,解决方法就是将这两个api进行顺序的调换,如下:

    url(r'queryLogDetail', log.query_log_detail),
    url(r'queryLog', log.query_log)
    

    这个样子就可以暂时解决问题,但是不排除之后写api会出现问题,还有一个解决方法

    解决方法二

    既然是正则表达式,有想法的各位获取已经想到了解决方法,加上$就可以解决问题了,正则表达式中这个符号表示结尾,于是做了如下修改:

    url(r'queryLog$', log.query_log),
    url(r'queryLogDetail$', log.query_log_detail)
    

    这样子写的话就可以解决问题

    3. 小结

    总之,在写django路由的时候要注意正则表达式的匹配问题,一定要确保前端请求的api或者前端请求的路由一定是你想要的路由,在真正上线之前要多加测试,经过自己的思考无问题之后才可以上线。

    我不管,JS天下第一
  • 相关阅读:
    flex space-between最后一行对齐问题的解决方案
    如何在父级下访问v-slot的值——vuejs
    flex下省略号的问题解决
    Typescript使用字符串联合类型代替枚举类型
    flex三个对齐属性的记忆方式
    JS中的slice()和splice()的区别以及记忆方式
    JS中的call,apply和bind及记忆方式
    Vue 还是 React 还是 Angular ?
    利用ES6的Promise.all实现至少请求多长时间
    .net core <environment> 不起作用
  • 原文地址:https://www.cnblogs.com/Jacob98/p/12321221.html
Copyright © 2011-2022 走看看