docs表示您可以设置trailing_slash=False
,但是如何使用或不使用尾部斜杠来允许两个端点都工作?
答案 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仅多余两个字符。而且它不涉及覆盖路由器。