我刚开始使用 Django,我发现在用户身份验证(使用典型的 django.contrib.auth 机制)方面我不太了解。
当我创建一个“site”时使用
django-admin.py startproject mysite
我知道我创建了类似“服务器”的东西。然后,我需要创建一个应用程序(如“getting started”教程中所述)。我为应用程序创建模型,而不是为服务器创建模型。我的想法(这可能是完全错误的)是应用程序之间是相当独立的(彼此完全隔离)。我为每个应用程序创建我的模型,每个应用程序有一组不同的“ View ”,等等。
但是当涉及到用户管理时,该管理似乎对整个项目(或“服务器”)是全局的:所有设置都是通过全局指定的 settings.py
文件,内置登录页面存储在全局 templates/
中目录...如果我有两个应用程序并且我希望它们的登录页面具有不同的外观怎么办?如果在成功登录后,我想重定向到 app#1 的特定页面或 app#2 的另一个特定页面,具体取决于用户尝试的应用登录?也许我误解了 Django 应用程序背后的整个概念?
基本上,我有一个 mystartapp
在名为 myserver
的项目中应用.我正在使用内置登录 View ,将表单发送到 "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/
的根目录将被重定向到同一组网址,就好像我使用了 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
?肮脏的把戏真的是肮脏的把戏还是它应该起作用的方式?我在这里错过了什么吗? (不过,我很确定最后一个问题的答案是“是!”)
提前谢谢你。
最佳答案
使用 LOGIN_REDIRECT_URL = '/mystartapp/index.html'
对您的情况不起作用有什么原因吗?
关于应用程序的概念,它们应该是独立的功能(这就是为什么它们有时被标记为“可重用”)。然而,一旦您将应用程序绑定(bind)到一个项目中,目标就是它们在某个时候确实可以协同工作!
在 contrib.auth
的情况下,这种可重用性由您使用的参数(例如 LOGIN_URL
或 LOGIN_REDIRECT_URL
)表示,它允许您配置应用程序的行为,使其在您的项目中运行。
例如,对于商家而言,您可以使用多个应用来执行与您的项目相关的不同操作:
- 具有您的实际功能(产品、页面...)的应用
- 一个搜索应用(比如
django-solr
) - 一个注册应用程序(
django-registration
) - 为身份验证、 session 贡献应用
- 商家支付应用
这些应用执行不同的功能,但它们都服务于相同的目的并共同构成一个项目。
如果您需要应用程序以完全独立的方式运行,那么它们首先不应属于同一个项目! (尽管您可以在项目 P 和 Q 中使用应用程序 A,而仅在项目 P 中使用应用程序 B)。
关于python - 基于每个应用程序的 Django 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388639/