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,kwargs,name)
re_path和path的作用都是一样的。只不过re_path 是在写url的时候可以用正则表达式,这点大家在源码regex 参数中应该可以看出来。
看到这里大家应该知道问题是如何解决了,由于我写的代码是:
url(r'queryLog',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$',url(r'queryLogDetail$',log.query_log_detail)
这样子写的话就可以解决问题
3. 小结
总之,在写django路由的时候要注意正则表达式的匹配问题,一定要确保前端请求的api或者前端请求的路由一定是你想要的路由,在真正上线之前要多加测试,经过自己的思考无问题之后才可以上线。 (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|