如何在Django Rest Framework SimpleRouter上设置尾部斜杠可选

时间:2017-09-11 20:25:18

标签: django trailing-slash django-rest-framework

docs表示您可以设置trailing_slash=False,但是如何使用或不使用尾部斜杠来允许两个端点都工作?

5 个答案:

答案 0 :(得分:16)

您可以覆盖SimpleRouter类的__init__ method

from rest_framework.routers import SimpleRouter


class OptionalSlashRouter(SimpleRouter):

    def __init__(self):
        self.trailing_slash = '/?'
        super(SimpleRouter, self).__init__()

?字符将使所有可用路径的斜杠成为可选项。

答案 1 :(得分:7)

您也可以通过将trailing_slash参数传递给SimpleRouter构造函数来覆盖此设置,如下所示:

from rest_framework import routers

router = routers.SimpleRouter(trailing_slash=False)

答案 2 :(得分:4)

如果您使用的是DRF的路由器和视图集,则可以在前缀中包含/?

from rest_framework import routers

from .views import ClientViewSet

router = routers.SimpleRouter(trailing_slash=False)
router.register(r"clients/?", ClientViewSet)

答案 3 :(得分:0)

对于将rest_framework_extensions与ExtendedSimpleRouter一起使用的任何人,接受的解决方案都需要进行一些小的修改。 self.trailling_slash必须像这样在super()之后。

from rest_framework_extensions.routers import ExtendedSimpleRouter

class OptionalSlashRouter(ExtendedSimpleRouter):
    def __init__(self):
        super(ExtendedSimpleRouter, self).__init__()
        self.trailing_slash = "/?"

答案 4 :(得分:0)

我发现最简单的方法就是单独设置您的网址以处理可选的尾随斜杠,例如

public static class MockExtensions
{
    public static ICustomSetup<TResult> SetupWithLogging<T, TResult>(this Mock<T> mock, Expression<Func<T, TResult>> expression) where T : class
    {
        string methodName = ((MethodCallExpression)expression.Body).Method.Name;

        return new CustomSetupParameters<T, TResult>(methodName, mock.Setup(expression));
    }
}

public interface ICustomSetup<in TResult>
{
    void Returns<TInput>(TResult result);
}

internal class CustomSetupParameters<T, TResult> : ICustomSetup<TResult> where T : class
{
    private readonly string _methodName;
    private readonly ISetup<T, TResult> _mock;

    internal CustomSetupParameters(string methodName, ISetup<T, TResult> mock)
    {
        _methodName = methodName;
        _mock = mock;
    }

    public void Returns<TInput1>(TResult result)
    {
        _mock.Returns<TInput1>((a) =>
        {
            Console.WriteLine($"{_methodName}({a}): {result}");

            return result;
        });
    }
}

这不是DRY解决方案,但是每个URL仅多余两个字符。而且它不涉及覆盖路由器。