我想创建一个主页,其标题要求使用用户名/密码登录,并使用登录按钮登录。目前,我如何设置我的页面是按下登录将我发送到登录页面。我想简单地输入信息并按“登录”登录我网站的主页。如何设计我的urls.py
和views.py
以在主页上执行登录?
我有base.html
这是我的主页面的模板。在模板中,我创建了一个login.html
部分视图:
<form action='/accounts/auth/' method='POST'> {% csrf_token %}
<div >
<label for='username'> Username </label>
<input type='text' name='Username' id='username'>
<label for='password'>Password </label>
<input type='password' name='Password' id='password'>
<input type='submit' value='login'>
</div>
</form>
我对action
属性感到有点困惑,因为如果我想在同一页面上授权登录,我不知道在哪里发送该表单数据。
我的views.py
def login(request):
c = {}
c.update(csrf(request))
return render(request, 'login.html', c)
def auth_view(request):
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username = username, password = password)
if user is not None:
auth.login(request, user)
return HttpResponseRedirect('/accounts/loggedin')
else:
return HttpResponseRedirect('/accounts/invalid')
如果登录完全在主页上完成,我不确定HttpResponseRedirect
的位置。
也许我可以render(request,SomePartialView.html)
代替HttpResponseRedirect
。
这是我的urls.py:
url(r'^$', 'photoblog.views.login'), #displays login.html
url(r'^accounts/auth/$', 'photoblog.views.auth_view'), #authorize login
答案 0 :(得分:13)
如果您只想拥有一个处理登录的静态内容的主页,Django内置的auth应用程序可以轻松处理这个问题。您只需将URL绑定到django.contrib.auth.views.login
,可能需要绑定到django.contrib.auth.views.logout
,写入登录模板和后退出模板,然后设置几个设置变量。
此处记录完整设置: https://docs.djangoproject.com/en/dev/topics/auth/default/#module-django.contrib.auth.views
以下是我工作项目的相关内容:
urls.py:
# HomeView is a simple TemplateView that displays post-login options
urlpatterns = patterns('',
...
url(r'^myapp/$', HomeView.as_view(template_name='home.html'), name='home'),
url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),
url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', name='logout'),
...
)
settings.py:
from django.core.urlresolvers import reverse_lazy
...
LOGIN_URL = reverse_lazy('login')
LOGIN_REDIRECT_URL = reverse_lazy('home')
templates/registration:
login.html:
{% extends "base.html" %}
{% block head %}
<title>Login</title>
{% endblock %}
{% block body %}
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}
logged_out.html:
{% extends "base.html" %}
{% block head %}
<title>Logged out</title>
{% endblock %}
{% block body %}
<p>You have been logged out. You may <a href="{% url 'login' %}">log back in</a>.</p>
{% endblock %}
我没有展示我的base.html
模板,但我相信这种模式很明显。如果您想要的不仅仅是一张裸登录表单,那么您的login.html
模板就没有理由变得更加漂亮。名称是默认值,如视图所述,但如果您愿意,可以使用其他选项。
这就是基本行为所需要的一切。如果您使用docs中描述的login_required
装饰器包装视图,则只要未经过身份验证的用户尝试访问您的某个视图,它就会重定向到您的登录页面。或者,如果您使用的是基于类的视图,请使用@method_decorator(login_required)
作为文档here。我的项目还有两个片段:
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class HomeView(TemplateView):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(HomeView, self).dispatch(*args, **kwargs)
@login_required
def report_for_group(request, group_id):
...
如果您需要,文档包括对一些更复杂的设置的讨论。
答案 1 :(得分:6)
我建议django-registration
这很容易。还有一个电子邮件验证。
你需要添加url
说回家:
url(r'^home/$', 'photoblog.views.home',name='home'),
.............
其views
,home
访问仅限于已登录的用户
from django.contrib.auth.decorators import login_required
@login_required(login_url='/') #if not logged in redirect to /
def home(request):
return render(request, 'home.html')
csrf
login.py
即:
def login(request):
return render(request, 'login.html')
就足够了,因为render
会传递csrf令牌。
from django.core.urlresolvers import reverse
def auth_view(request):
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username = username, password = password)
if user is not None:
auth.login(request, user)
return HttpResponseRedirect(reverse('home'))
else:
return HttpResponseRedirect('/accounts/invalid')
答案 2 :(得分:3)
您可以使用Django内置的登录表单。它退出简单而有效。它将为您提供一些功能,如表单验证检查。
在urls.py中:
url(r'^login/$',views.loginView,name='login'),
在views.py中:
from django.contrib.auth.views import login
from django.contrib.auth.forms import AuthenticationForm
def loginView(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = form.get_user()
login(request, user)
return redirect('/website/profile/')
else:
form = AuthenticationForm()
return render(request, 'website/login.html', {'form': form})
在html页面中:
<form method="post">
{% csrf_token %}
{{form.as_p}}
<p><input type="submit" value="Log in"></input></p>
答案 3 :(得分:2)
使用Django 1.11。 我刚才遇到了同样的问题,这里有什么对我有用......
从内置的auth应用程序导入登录视图类,并通过template_name
kwarg传入模板文件。
在urls.py中:
from django.contrib.auth.views import LoginView
app_name = 'yourapp'
urlpatterns = [
url(r'^$', LoginView.as_view(template_name='yourapp/index.html'), name="index"),
]
在您的视图中,您可以使用表单变量来呈现表单。 在我的情况下,我使用bootstrap。
在index.html中:
{% extends 'base.html' %}
{% loads bootstrap %}
{% block content %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
{% bootstrap_form form %}
{% bootstrap_button "Login" button_type="submit" button_class="btn-primary" %}
{# Assumes you setup the password_reset view in your URLconf #}
<p><a href="{% url 'password_reset' %}">Lost password?</a></p>
</form>
{% endblock content %}
答案 4 :(得分:0)
我找到了解决方案。
首先,自定义登录和注销视图:
views.py
def login_user(request):
logout(request)
username = password = ''
form1 = RegistrationForm()
if request.POST:
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return redirect("redirect any whre u want")
return render(request, 'Write login templaye address')
def logout_user(request):
user = request.user
logout(request, user)
return redirect("redirect any whre u want")
然后在你的base.html中你应该这样做:
base.html文件
<form method="post" action="/user/login/" novalidate>
{% csrf_token %}
<input class="form-control" id="id_username" name="username" placeholder=""
required="" type="text"
style="">
</div>
<div class="form-group">
<span class="material-icons" style=""
>lock</span>
<input class="form-control" id="password1" name="password" style="" autofocus=""
placeholder=""
required=""
type="password">
</div>
<button class="btn btn-primary" type="submit" style=""></button>
</div>
</form>
和login.html
<form method="post" action="/user/login/">
{% csrf_token %}
<div class="form-group">
<p>
<label for="id_username">username</label>
<input class="form-control" id="id_username" name="username" autofocus="" required="" type="text">
</p>
<p>
<label for="id_password">password</label>
<input class="form-control" id="id_password" name="password" autofocus="" required="" type="password">
</p>
<button type="submit">login</button>
</div>
</form>
urls.py
url(r'^login/$', views.login_user, name='login'),
url(r'^logout/$', views.logout_user),
实际上,你在主页上输入并将它们放入登录页面,这对于输入错误处理非常有用。