【问题标题】:Django REST framework url regex patterns not being matchedDjango REST框架url正则表达式模式不匹配
【发布时间】:2017-03-18 19:51:30
【问题描述】:

我正在编写一个 RESTful API 作为 django 项目的应用程序。 我的应用程序中有两个端点(将 url 导入到主项目的 urls.py 中),它们的定义如下所示:

testrest/urls.py

​​>
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'prices/(?P<ticker>[X]{1}[A-Z0-9]{3}:[A-Z0-9]{1}[A-Z09.-]{1,4})/?P<resolution>([0-9]{0,3})/$', views.historyPrices, name='prices'),
    url(r'chart/?P<name>([a-zA-Z0-9_\.-]{8,12})/$s', views.chart, name='pchart'),
]

testrest/views.py

​​>
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response



# Create your views here.
@api_view(['GET'])
def historyPrices(request, ticker, resolution=1):
    if request.method == 'GET':
        try:
            # do something
            return Response({'foo': 'foobar'})

        except Exception as e:
            print ('Error: {0}'.format(e))
            return Response(status = status.HTTP_500_INTERNAL_SERVER_ERROR)     
    else:
        return Response(status = status.HTTP_405_METHOD_NOT_ALLOWED)



@api_view(['GET', 'POST', 'PUT', 'DELETE'])
def chart(request, name=None):
    if request.method == 'GET':     
        if (name is not None):      
            try:
                # do something
            except Exception as e:
                print('Error:',e)
                return Response(status = status.HTTP_404_NOT_FOUND)         

            return Response({'foo': 'bar')
        else:
            return Response(status = status.HTTP_400_BAD_REQUEST)


    elif request.method == 'POST':
        data = request.data
        # print(data)

        try:
            # do something
            return Response(status = status.HTTP_201_CREATED)       

        except Exception as ex:
            print('Unhandled exception: {0}'.format(e))
            return Response(status = status.HTTP_500_INTERNAL_SERVER_ERROR)


    elif request.method == 'PUT':
        print('Called with PUT')
        return Response(status=status.HTTP_501_NOT_IMPLEMENTED)

    elif request.method == 'DELETE':
        print('Called with DELETE')
        return Response(status=status.HTTP_501_NOT_IMPLEMENTED)

    else:
        return Response(status=status.HTTP_400_BAD_REQUEST)

我希望能够使用以下 url 进行调用(如下所示,返回 404 not found 错误:

curl http://127.0.0.1:8000/testrest/prices/XNAS:GOOG      (404)
curl http://127.0.0.1:8000/testrest/prices/XNAS:GOOG/     (404)
curl http://127.0.0.1:8000/testrest/prices/XNAS:GOOG/3    (404)
curl http://127.0.0.1:8000/testrest/prices/XNAS:GOOG/3/   (404)

curl http://127.0.0.1:8000/testrest/prices?ticker=XNAS:GOOG      (404)
curl http://127.0.0.1:8000/testrest/prices/?ticker=XNAS:GOOG&resolution=3    (404)
curl http://127.0.0.1:8000/testrest/prices?ticker=XNAS:GOOG&resolution=3/   (404)

我现在尝试从服务器加载手动创建的图表 (xyz):

curl http://127.0.0.1:8000/testrest/chart/xyz                 (404)
curl http://127.0.0.1:8000/testrest/chart/xyz/                (404)
curl http://127.0.0.1:8000/testrest/chart?name=xyz            (404)

然后我尝试在服务器上发布(创建)一个新图表:

curl -H "Content-Type: application/json" -X POST -d '{/* data */}' http://127.0.0.1:8000/testrest/chart     (404)

为什么模式不匹配?

【问题讨论】:

    标签: python django rest django-rest-framework


    【解决方案1】:

    您的urls 中有一些拼写错误。您缺少 regex named group &lt;resolution&gt;&lt;name&gt; 的语法。以下将匹配上述所有 404 失败:

    urlpatterns = [
        url(r'prices/?(?P<ticker>[X]{1}[A-Z0-9]{3}:[A-Z0-9]{1}[A-Z09.-]{1,4})?/?(?P<resolution>[0-9]{0,3})/?$', views.historyPrices, name='prices'),
        url(r'chart/?(?P<name>[a-zA-Z0-9_\.-]{3,12})?/?$', views.chart, name='pchart')
    ]
    

    另外,我将pchart url 中&lt;name&gt; 的长度更改为3 到12 之间(不知道你想怎么样)。

    【讨论】:

    • 我正在尝试价格 API,它几乎就在那里 - 至少不再有 404 - 但是参数没有被传递给被调用的函数! ://
    • 票证和决议都没有通过?
    • 是的,没错。在我的视图函数中,我将分辨率的默认值设置为 1。但是,无论我使用什么值调用 API,分辨率都会作为空字符串接收,而ticker 作为 NoneType 接收:/
    • 我还没有开始看图表API。但是,我希望 name 参数是可选的。该名称仅用于 GET 调用,因此我想在其他 REST 动词中省略它。我将只在 GET 上进行字符串验证
    • 我只是测试了prices API,参数完美地传递给了view!我正在使用 Django 1.10 和 Python 3.5 仅供参考
    猜你喜欢
    • 2011-08-17
    • 2017-09-12
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    相关资源
    最近更新 更多