基于每个应用程序的Django身份验证

时间:2012-11-14 22:40:52

标签: python django redirect login django-views

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

当我使用

创建“site”时
django-admin.py startproject mysite 

我理解我创建的东西就像“服务器”。然后,我需要创建一个应用程序(如“getting started”教程中所述)。我为应用程序创建了模型,而不是为服务器创建。我的想法(可能完全错误)是应用程序之间相互独立(相互隔离)。我为每个应用创建我的模型,每个应用程序有一组不同的“视图”等。

但是当谈到用户管理时,整个项目(或“服务器”)的管理似乎是全局的:所有设置都是通过全局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/根目录的所有内容都将重定向到同一组网址,就像我使用{ {1}}与127.0.0.1:8000/mystartapp/中的LOGIN_REDIRECT_URL = '/'选项相结合,最终会使浏览器在正确登录后重定向到settings.py,但这似乎并不“干净”

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

提前谢谢。

1 个答案:

答案 0 :(得分:2)

有没有理由说使用LOGIN_REDIRECT_URL = '/mystartapp/index.html'在你的情况下不起作用?


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

对于contrib.auth,此可重用性由您使用的参数(例如LOGIN_URLLOGIN_REDIRECT_URL)表示,它允许您配置应用的行为,以便它适用于您的项目。

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

  • 具有实际功能的应用(产品,页面......)
  • 搜索应用(例如django-solr
  • 注册应用(django-registration
  • 为认证提供应用,会话
  • 支付商家应用

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


如果您需要应用程序以完全独立的方式运行,它们首先不应该属于同一个项目! (虽然你可以在项目P和Q中使用app A,例如在P中使用app B)。