我正在考虑对 Django 项目实施用户身份验证。我正在阅读文档。它看起来很简单,但有一件事我不明白。
显然,认证包括八个视图:
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
Run Code Online (Sandbox Code Playgroud)
在实现密码重置时,我假设我想要执行的操作accounts/password_reset/是向用户转发一封电子邮件。然后,我需要实现accounts/reset/<uidb64>/<token>/,这是通过电子邮件将用户定向到的位置。我不清楚的是当用户成功更新密码后应该做什么。
accounts/reset/done/(或password_resest_complete) 和accounts/password_reset/done/(或)有什么区别password_reset_done?
我已经被这个问题困扰了几个小时。我是 django 和自动化测试的新手,我一直在使用 Selenium 和 django 的 StaticLiveServerTestCase。我一直在尝试测试我的登录表单(顺便说一句,当我使用 runserver 并自己测试它时,它工作得很好。)
一切工作都很好,除了我似乎无法成功登录我的测试用户。我已将断点范围缩小到 django 的 User.authenticate 方法。
User 对象在我的设置中已成功创建,我可以通过在测试方法中访问它的属性来确认这一点。但是,身份验证失败。
我查看了以下内容以寻求帮助,但他们并没有让我走得太远:
知道为什么身份验证失败吗?我需要在设置中添加一些内容吗?
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
class AccountTestCase(StaticLiveServerTestCase):
def setUp(self):
self.selenium = webdriver.Chrome()
super().setUp()
User.objects.create(username='test', email='test@test.com', password='Test1234', is_active=True)
def tearDownClass(self):
self.selenium.quit()
super().tearDown()
def test_register(self):
user = authenticate(username='test', password='Test1234')
if user is not None: # prints Backend login failed
print("Backend login …Run Code Online (Sandbox Code Playgroud) 在 Django 中,我创建了一个自定义用户。
我的问题是默认验证器不起作用,任何密码都被接受。
我期望默认的密码验证器能够工作,因为我继承了默认的模型/表单类。
在 Django 设置中我有:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 12,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
Run Code Online (Sandbox Code Playgroud)
]
自定义用户实现:
class User(AbstractBaseUser, MetaData, PermissionsMixin):
account = models.ForeignKey(Account, blank=True, null=True, related_name='owner', on_delete=models.CASCADE)
email = models.EmailField(max_length=255, unique=True)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
is_confirmed = models.BooleanField(default=False) # email confirmed
is_active = models.BooleanField(default=False) # can't login
is_staff = models.BooleanField(default=False) # staff user non super
is_superuser = models.BooleanField(default=False) # superuser …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,显示所有具有如下模型的新闻站点:
class NewsItem(models.Model):
url = models.CharField(max_length=500, default="",unique=True)
title = models.CharField(max_length=500, default="")
hacker_news_url = models.CharField(max_length=500, default="")
posted_on = models.DateTimeField(default=datetime.now)
upvote_count = models.IntegerField(default=0)
comment_count = models.IntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)
我已经设置了默认的 django 身份验证来查看此页面。用户界面为每个帖子都有隐藏按钮。所以问题是,如果登录用户隐藏帖子,则必须仅为该用户隐藏该帖子(即使在页面刷新后),而不能从 NewsItem 模型/表中删除。怎么做?请帮助!
这是我的观点.py:
@login_required(login_url='/accounts/login')
def index(request):
context={'news_items':NewsItem.objects.all().order_by('posted_on')}
return render(request, "hello.html", context)
Run Code Online (Sandbox Code Playgroud) django django-models django-admin django-views django-authentication
在我的base.html文件中,我正在使用
此处,即使用户已登录,也会显示登录按钮.
{% if user.is_authenticated %}
<a href="#">{{user.username}}</a>
{% else %} <a href="/acc/login/">log in</a>
现在,当我点击log in链接时,它会显示用户名和正常登录视图,表示用户已登录.
那么,怎么了?
在我建立用户的系统中,不能自己注册.用户由其中一个系统管理员添加.因此没有用户注册表单或视图.注册只在管理员中进行,所以我猜send_mail也必须在那边(或者我错了)?
我需要在创建用户时向用户发送一封自动发送的电子邮件,然后才发送给用户(不是每次保存模型).
有人能帮忙吗?有内置的东西吗?或者我该怎么做?
我已经阅读了有关create_user用户管理器的信息,但我认为有一种更好的方法可以编辑管理器.
我处于这样一种情况,我需要制作自定义身份验证和自定义中间件来验证和授权用户.我必须在POST请求中设置用户名密码params,或者是否设置了cookie用于基于令牌的身份验证.现在,我知道python中不允许函数重载,我怎么能实现它.我将下面的代码放在自定义身份验证和自定义中间件上.
自定义中间件:
from django.contrib.auth import authenticate
class AuthMiddleWare(object):
def process_request(self, request):
if request.path != '/favicon.ico':
print "inside process_request " + request.path
if request.method == 'POST' and request.POST.has_key('username' ) and request.POST.has_key('password'):
authenticate(username = request.POST.get('username'),password = request.POST.get('password'))
if 'SPRING_SECURITY_REMEMBER_ME_COOKIE' in request.COOKIES:
authenticate(token = request.COOKIES.get('SPRING_SECURITY_REMEMBER_ME_COOKIE'))
return None
Run Code Online (Sandbox Code Playgroud)
和自定义身份验证后端:
from core.api import NcpAPI
class CustomNCPAuthBackend(object):
"""
This is custom authentication backend.
Authenticate against the webservices call.
The method below would override authenticate() of django.contrib.auth
"""
def authenticate(self, username = None, password = None):
print …Run Code Online (Sandbox Code Playgroud) python django django-middleware django-authentication python-2.7
我想为使用python-social-auth的 Django应用程序编写单元测试.运行Django并使用浏览器时,这一切都很棒,感谢python-social-auth!
但是,我似乎无法编写单元测试,因为我无法创建经过身份验证的客户端进行测试.
有没有人这么成功?
你是如何获得经过身份验证的客户端()的?
我试过这个(登录返回false并且不起作用):
self.c = Client()
self.u = User.objects.create(username="testuser", password="password", is_staff=True, is_active=True, is_superuser=True)
self.u.save()
self.auth = UserSocialAuth(user=self.u, provider="Facebook")
self.auth.save()
self.c.login(username=self.u.username, password=self.u.password)
Run Code Online (Sandbox Code Playgroud) 在尝试验证我的用户时,我在django中遇到了一个奇怪的错误.
这是代码:
views.py
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.template import RequestContext
from django.core.context_processors import csrf
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import authenticate, login
def authenticate(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a success page.
else:
pass
# Return a 'disabled account' error message
else:
pass
# Return an 'invalid login' error message.
Run Code Online (Sandbox Code Playgroud)
它一直给我这个错误:
Environment:
Request Method: POST
Request URL: …Run Code Online (Sandbox Code Playgroud) 我通过扩展rest_framework.views.APIView类来构建Django API视图。
我已经成功构建了许多仅由经过身份验证的用户才能调用的API。我通过添加以下内容来完成此操作:permission_classes = [permissions.IsAuthenticated,]
有些API我只希望未经身份验证的用户调用。如“ ForgotPassword”。基本上,我想确保API调用程序不会在请求标头中发送JWT令牌。我该如何执行?没有permissions.IsUnAuthenticated。
django ×10
python ×5
django-admin ×2
django-tests ×1
django-users ×1
django-views ×1
oauth ×1
python-2.7 ×1
selenium ×1
unit-testing ×1