我正在尝试登录用户以显示网页。我创建了自己的登录和注册表单,并处理自己的登录身份验证。我使用django的login()
方法。
现在我知道了,因为我没有使用django登录和身份验证,所以我需要创建一个名为last_login
的额外字段,我已经这样做了。这是我的django型号
class SignUp(models.Model):
password = models.CharField(null=False, max_length=50)
username = models.EmailField(null=False)
last_login = models.DateTimeField(auto_now=True, blank=True)
当用户点击/注册url时,这将为用户注册。下面是该模型的postgres表。
Column | Type | Modifiers
------------+--------------------------+-----------
id | integer |
username | character varying(100) |
password | character varying(50) |
last_login | timestamp with time zone |
但是,当用户尝试使用他们的用户名和密码登录时(在访问/登录url后(,我会得到以下错误
ERROR 2018-07-22 22:38:18,625 django.request Internal Server Error: /login
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
response = self._get_response(request)
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/root/Utora/kriktona/webhook/ui_server.py", line 94, in authenticate
login(request, user.first())
File "/usr/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 156, in login
user_logged_in.send(sender=user.__class__, request=request, user=user)
File "/usr/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 193, in send
for receiver in self._live_receivers(sender)
File "/usr/lib/python2.7/site-packages/django/contrib/auth/models.py", line 25, in update_last_login
user.save(update_fields=['last_login'])
File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 806, in save
force_update=force_update, update_fields=update_fields)
File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 836, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 894, in _save_table
raise ValueError("Cannot force an update in save() with no primary key.")
ValueError: Cannot force an update in save() with no primary key.
这是下面登录的验证码
@csrf_exempt
def authenticate(request):
if request.method == "POST":
user_request = request.POST
user = SignUp.objects.filter(username=user_request.get("username"))
if user:
password_db = str(user.values("password")[0]["password"])
if password_db == user_request.get("password"):
login(request, user.first())
redirect("/home")
else:
return HttpResponse("Failure")
else:
return HttpResponse("Failure")
else:
print("show login page")
return render(request, 'login.html')
我不太确定我哪里错了。
您可以通过更改轻松修复它
user = SignUp.objects.filter(username=user_request.get("username"))
至
user = SignUp.objects.filter(username=user_request.get("username"), password=user_request.get("password"))
if user:
return login(request, user)
然而,正如评论中的人所说,你应该强烈阅读这篇文章,因为contrib allready拥有你所需要的一切,并对其进行加密,它比你的更安全。https://docs.djangoproject.com/en/2.0/ref/contrib/auth/#django.contrib.auth.models.User.last_login