3

我刚开始使用 Django,发现在用户身份验证方面我不太了解(使用典型的django.contrib.auth机制)。

当我创建一个“网站”使用

django-admin.py startproject mysite 

我知道我创建了类似“服务器”的东西。然后,我需要创建一个应用程序(如“入门”教程中所述)。我为应用程序创建模型,而不是为服务器创建模型。我的想法(这可能是完全错误的)是应用程序之间是相当独立的(彼此非常隔离)。我为每个应用程序创建我的模型,每个应用程序都有一组不同的“视图”,等等。

但是当涉及到用户管理时,这种管理似乎对整个项目(或“服务器”)来说是全局的:所有的设置都是通过全局settings.py文件指定的,内置的登录页面存储在全局templates/目录中......如果我有两个应用程序并且我希望它们的登录页面具有不同的方面怎么办?如果在成功登录后,我想根据用户尝试登录的应用程序重定向到app#1的特定页面或app#2的另一个特定页面怎么办?也许我误解了 Django 应用程序背后的整个概念?

基本上,我mystartapp在一个名为myserver. 我正在使用内置登录视图,将表单发送到"django.contrib.auth.views.login". 使用默认配置,成功登录试图将我重定向到http://127.0.0.1:8000/accounts/profile/我没有的。

settings.py我可以通过编辑全局文件和全局文件找到解决方法urls.py

---------- settings.py ----------
[ . . . ]
# User Logging in Settings
LOGIN_URL = '/login'
LOGIN_REDIRECT_URL = '/'
[ . . . ]
---------------------------------

------------ urls.py ------------
urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'myserver.views.home', name='home'),
    # url(r'^myserver/', include('myserver.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    #The following line will include the urls for the "mystartapp" application 
    url(r'^s', include('mystartapp.urls', namespace="mystartapp")), #Dirty trick
    url(r'^mystartapp/', include('mystartapp.urls', namespace="mystartapp")),
    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
    url(r'^login/$', 'django.contrib.auth.views.login'),
)
------------------------------

这样,多亏了第 10 行(带有#'Dirty trick'注释的行),所有到根目录的内容127.0.0.1:8000/都将被重定向到与我使用的相同的一组 url 127.0.0.1:8000/mystartapp/,它与 中的 LOGIN_REDIRECT_URL = '/'选项相结合settings.py,最终将使浏览器在正确登录后重定向到127.0.0.1:8080/mystartapp/index.html,但这似乎并不“干净”。

有没有更好的方法来建立重定向127.0.0.1:8080/mystartapp/index.html?肮脏的把戏真的是肮脏的把戏还是它应该起作用的方式?我在这里错过了什么吗?(不过,我很确定最后一个问题的答案是“是的!”)

先感谢您。

4

1 回答 1

3

LOGIN_REDIRECT_URL = '/mystartapp/index.html'在您的情况下使用不起作用有什么原因吗?


关于应用程序的概念,它们应该是独立的功能部分(这就是它们有时被标记为“可重用”的原因)。但是,一旦将应用程序绑定到项目中,目标就是它们在某个时候确实可以协同工作!

在 的情况下contrib.auth,这种可重用性由您使用的参数(例如LOGIN_URLLOGIN_REDIRECT_URL)表示,它允许您配置应用程序的行为,使其在您的项目中工作。

例如,对于商家而言,您可以使用多个应用程序来执行与您的项目相关的不同操作:

  • 具有您的实际功能(产品、页面...)的应用程序
  • 搜索应用程序(如django-solr
  • 注册应用程序 ( django-registration)
  • 用于身份验证、会话的贡献应用程序
  • 用于支付的商家应用程序

这些应用程序执行不同的功能,但它们都具有相同的目的并共同构成一个项目。


如果您需要应用程序以完全独立的方式运行,那么它们首先不应该是同一个项目的一部分!(例如,尽管您可以在项目 P 和 Q 中使用应用程序 A,而仅在 P 中使用应用程序 B)。

于 2012-11-14T22:48:08.757 回答