【问题标题】:What is the correct method for implementing <mysite.com/some_user> URL routing in Django?在 Django 中实现 <mysite.com/some_user> URL 路由的正确方法是什么?
【发布时间】:2019-07-27 19:21:26
【问题描述】:

我希望我的网站成员能够通过 URL mysite.com/some_user 而不是 mysite.com/profiles/some_user 访问其他用户的个人资料页面,但是对于另一个 url 路径的每个请求,负责用户个人资料页面的查看功能都会被执行。

我希望 Django 在找到匹配路径时停止寻找任何其他 url 路径,这是我的根 URL 配置:

urlpatterns = [
    path('feedstream/', feed_stream)),
    path('<str:username>', view_profile)
]

这是负责/some_user的视图:

def view_profile(request,username):

    try:
        member = User.objects.get(username=username)
        member_events = Feed.my_events(member)
        return render(request,'profile.html',{'member_events':member_events})

    except User.DoesNotExist:
        print('No data')
        return HttpResponse('No data')

现在,当我向其他视图发送请求时,例如 mysite.com/feedstream(这不是用户个人资料页面),尽管页面加载正确,view_profile() 也会被执行(根据服务器上的 No data 打印判断控制台)

换句话说,在 Django 文档中它声明:

"Django 依次遍历每个 URL 模式,并在第一个匹配请求的 URL 时停止"

我问为什么要在 view_profile() 之前有匹配的模式时调用它。

我在网上找不到任何指南可能是因为我不知道问题的确切关键字,我做错了什么?

【问题讨论】:

  • 我不明白。您拥有/username 的 view_profile 视图。现在你想要什么?
  • 尽管它有效,但我不确定这是不是正确的做法,因为在另一个 url 例如 mysite.com/feedstream 解析后,Django 也运行 view_profile() 这不是预期的行为
  • @heemayl "当我向其他视图发送请求时,例如 mysite.com/feedstream(这不是用户个人资料页面),尽管页面加载正确,view_profile() 也会被执行(判断为No data 在服务器控制台上打印)"

标签: python django


【解决方案1】:

你是对的,视图 view_profile 将被调用为任何 URL 路径,这是一个字符串(除非你有一些特定的路径,如 &lt;int:someint&gt; 或类似的过滤)在根级别,例如/foobar, /spamegg` 等等。

这是另一个路径级别内的特定配置文件的好地方,即在父级内,例如:

path('profile/<str:username>/', view_profile) 

profile 下可以有多个路径,也可以在其他文件和include URL confs 中定义:

path('profile/', include('profile.urls')

profile.urls 你可以这样做:

path('<str:username>/', view_profile)

将自动解析为/profile/&lt;username&gt;/

【讨论】:

  • 是的,我可以这样做,但正如我解释的那样,我想避免父级别,在 Django 文档状态中:“Django 按顺序运行每个 URL 模式,并在第一个匹配请求的 URL “这就是为什么我问为什么要在 view_profile() 之前存在匹配模式时调用它
  • @ArminHemati 为什么你不想要这个?除非您的 URL 中有一个非常特定的模式(如所有整数),否则您不会得到您想要的。将 URL 与父级分开是解决此类问题的最佳解决方案。
  • 我认为这是一个更好的用户体验设计,就像 twitter 或 instagram 的工作方式一样,你有 twitter.com/heemayl_ 而不是 twitter.com/profiles/heemayl
  • @ArminHemati 然后你需要在最后提供这个,并将所有其他 URL 放在顶部,但记住它们不能像你需要一些东西作为前缀一样通用,否则所有路径都将被重定向到他们没有进入个人资料,因为所有这些都是从根开始的,没有任何父母。
  • 感谢您的建议,很高兴我现在解决了问题并添加了答案。 django 正在按预期工作,问题是浏览器生成的请求 duhh -_- ...
【解决方案2】:

所以我想通了,我的实现方法似乎是正确的。调用 view_profile() 的原因是浏览器对静态文件 /favicon.ico 发出的 GET 请求与模式 path('&lt;str:username&gt;', view_profile) 匹配。 每次刷新页面时,都会发送此请求,无论我导航到哪个 URL,这让我发疯。

我将停止此自动请求或寻找解决方法。

【讨论】:

    猜你喜欢
    • 2015-02-10
    • 2011-11-06
    • 2018-08-12
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多