6

我已经开发了自己的,但似乎这是一件足够好的事情,其他人可能首先想到它并且做得更好;)

目标是能够在您的 myapp/views.py 中编写

router = Router(prefix=r'^myapp/')

@router.route(url=r'my/url/here', name="my-great-view")
def myview(request):
    return render_to_response("mytemplate.html", {})

然后在 urls.py

urlpatterns += myapp.views.router.get_patterns()

我还内置了其他一些很酷的装饰器(@jsonview 用于获取返回的字典并做出 json 响应,@use_template 用于获取返回的字典并将其作为上下文传递给定义的模板......)

似乎这种方式使所有内容都更加本地化并且可读。在查看视图函数时,您不必四处搜索以找到它所属的 url 或它的“名称”。

我看到了这个djangosnippet,但它比我想要的要神奇得多,而且看起来它并没有被普遍采用。

如果没有人制定标准解决方案,我应该清理我的并提交拉取请求给 contrib 吗?

  • 这是我目前已经实现的:magic.py

编辑: 如果您想要同一视图的多个网址:

@router.route(url="my-first-url", kwargs={'foo':'bar'})
@router.route(url="my-second=url", kwargs={'foo':'baz'})
def my_view(...): ...

当然,这不一定是唯一的方法——普通的 urlpatterns 方法有一些关于它的好处,但是这两种方法并不相互排斥。

4

2 回答 2

2

常规配置我们有一个主网站urls.py。并且urls.py包含名为urlpatterns.

所以我可以将一些 url_pattern 推入其中。

应用程序/views.py

from django.urls import path as djpath

URLS = []
URLS_d = {}


def route(path=''):
    def wrapper(func):
        path_name = path or func.__name__
        URLS.append(
            djpath(path_name, func)
        )

        ### below is not important ####
        path_func = URLS_d.get(path_name, None)
        if path_func:
            print(path_func, '<>', func)
            raise Exception('THE same path')
        URLS_d[path_name] = func
        ### above is not important ####

    return wrapper

@route()
def index(req):
    return HttpResponse('hello')

网站/urls.py

from app.views import URLS

urlpatterns.extend(URLS)
于 2019-10-08T08:54:35.853 回答
1

如果你使用类基视图,你可以使用django-request-mapping

一个简单的例子
  • 视图.py
from django_request_mapping import request_mapping


@request_mapping("/user")
class UserView(View):

    @request_mapping("/login/", method="post")
    def login(self, request, *args, **kwargs):
        return HttpResponse("ok")

    @request_mapping("/signup/", method="post")
    def register(self, request, *args, **kwargs):
        return HttpResponse("ok")

    @request_mapping("/<int:user_id>/role/")
    def get_role(self, request, user_id):
       return HttpResponse("ok") 

    @request_mapping("/<int:pk/", method='delete')
    def delete(self, request, pk):
        User.objects.filter(pk=pk).delete()
        return HttpResponse("ok")


@request_mapping("/role")
class RoleView(View):
    # ...

  • 网址.py
from django_request_mapping import UrlPattern
urlpatterns = UrlPattern()
urlpatterns.register(UserView)
urlpatterns.register(RoleView)

和请求网址是:

post:  http://localhost:8000/user/login/
post:  http://localhost:8000/user/signup/
get:  http://localhost:8000/user/1/role/
delete: http://localhost:8000/user/1/
# ...
于 2020-03-29T04:17:48.930 回答