美文网首页
django-用户认证系统(注册,登录,校验,celery发送邮

django-用户认证系统(注册,登录,校验,celery发送邮

作者: 眼睛好酸 | 来源:发表于2018-03-10 17:17 被阅读0次

项目开发中视图处理一般流程:
1.接收参数
2.参数校验(后端校验)
3.处理业务逻辑
4.返回应答

  1. 为了将项目里面的文件夹加入django自动搜索路径
    import os
    import sys
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))
    sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
    [图片上传失败...(image-4e83bb-1520673419181)]

1.接收参数
2.参数校验(后端校验)
校验数据完整性
校验邮箱格式
3.业务处理:注册
django认证系统:
create_user: 创建用户
authenticate: 登录验证
login: 记住用户登录状态
logout: 清除用户登录状态
[http://python.usyiyi.cn/documents/django_182/topics/auth/default.html]
注意: 如果authenticate返回None, 可能是User.objects.create_user()里面的参数顺序不对
4.返回应答

celery:
[图片上传失败...(image-7df1ef-1520673419182)]

bug: 两个应用名错误, 注册的时候忘记逗号

登录校验:
request对象有一个user属性, request.user
如果用户已登录, 是一个认证用户模型类(User)的对象, 包含登录用户的信息
如果未登录,request.user是一个匿名用户(AnonymousUser)类的一个实例
request.user.is_authenticated:
User类的该属性是True
AnonymousUser类的该属性是False
在模板文件中可以直接使用一个模板变量user, 实际上就是request.user[图片上传失败...(image-8fe137-1520673419182)]

将session存到redis数据库
http://django-redis-chs.readthedocs.io/zh_CN/latest/
安装包:pip install django-redis

django发送邮件(SMTP服务器)

1.导入包
from django.core.mail import send_mail

2.获取163SMTP客户端授权码
[图片上传失败...(image-3aece2-1520673419182)][图片上传失败...(image-7c3340-1520673419182)]
[图片上传失败...(image-bab5df-1520673419182)]
[图片上传失败...(image-e01cca-1520673419182)]

3.配置项目的setting.py,添加如下配置

# 发送邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
# 发送邮件的邮箱
EMAIL_HOST_USER = '邮箱地址'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = '密码'
# 收件人看到的发件人
EMAIL_FROM = '名称<邮箱地址>'

4.在应用views.py中新建send函数

from django.conf import settings
from django.core.mail import send_mail
from django.http import HttpResponse
...
def send(request):
    send_mail(subject='邮件标题',
                message='邮件html会转义正文',
                from_email='发件人',
                recipient_list='收件人列表',
                html_message='html不转义正文,**该参数为关键字参数**')
    return HttpResponse('ok')

5.配置应用url
url(r'^send/$',views.send),
6.测试调用发送函数
http://127.0.0.1:8000/send/

django中celery 异步发送邮件

1.安装celery和django-celery
pip install celery==3.1.25
pip install django-celery==3.1.17
注意:celery和djcelery的大版本需要一样, 不然会冲突
2.在应用booktest的views.py文件中创建def sayhello(request)函数

import time
...
def sayhello(request):
    print('hello ...')
    time.sleep(2)
    print('world ...')
    return HttpResponse("hello world")

3.在应用booktesturls.py中配置
url(r'^sayhello$',views.sayhello),
4.启动服务器,访问网址
http://127.0.0.1:8000/sayhello/
5.两次输出之间等待一段时间才会返回结果,终端中可以看到等待过程
6.在项目的settings.py中注册djcelery应用

INSTALLED_APPS = (
  ...
  'djcelery',
}

7.在项目settings.py文件中配置代理和任务模块。

import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/2'

8.在应用booktest目录下创建tasks.py文件

import time
from celery import task

@task #一定要装饰之后才能正常使用
def sayhello():
    print('hello ...')
    time.sleep(2)
    print('world ...')

9.将应用booktest的views.py文件,修改sayhello视图如下

from booktest import tasks
...
def sayhello(request):
    # print('hello ...')
    # time.sleep(2)
    # print('world ...')
    tasks.sayhello.delay()
    return HttpResponse("hello world")

10.执行迁移生成celery需要的数据表。
python manage.py migrate
11.启动redis
redis-server +配置文件路径
12.django项目启动worker
python manage.py celery worker --loglevel=info
注意:需要在manage.py目录使用该命令

13.打开新终端,进入虚拟环境,启动服务器,刷新浏览器。 在旧终端中两个输出间仍有时间间隔。注意两个终端中的时间,服务器的响应是立即返回的。
14.打开应用booktest/task.py文件,修改为发送邮件的代码,就可以实现无阻塞发送邮件。

from django.conf import settings
from django.core.mail import send_mail
from celery import task

@task
def sayhello():
    msg='<a href="网站" target="_blank">点击激活</a>'
    send_mail('注册激活','',settings.EMAIL_FROM,
              ['邮箱'],
              html_message=msg)

django内置login/logout函数使用

1.login(request, user)
从视图中登入一个用户,请使用login()。它接受一个HttpRequest对象和一个User对象。login()使用Django的session框架来将用户的ID保存在session中。

注意任何在匿名会话中设置的数据都会在用户登入后的会话中都会记住。

下面的示例向你演示如何使用authenticate() 和login():

from django.contrib.auth import authenticate, login

def my_view(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:
            # Return a 'disabled account' error message
            ...
    else:
        # Return an 'invalid login' error message.
        ...

先调用authenticate()认证Users:
使用authenticate(),认证一组给定的用户名和密码。它接收关键字参数形式的凭证,使用默认配置时参数是username和password,如果密码能够匹配给定的用户名,它将返回一个User对象。如果密码无效,authenticate()返回None.

from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
    # the password verified for the user
    if user.is_active:
        print("User is valid, active and authenticated")
    else:
        print("The password is valid, but the account has been disabled!")
else:
    # the authentication system was unable to verify the username and password
    print("The username and password were incorrect.")

当你是手工登入一个用户时,你必须在调用login()之前通过authenticate()成功地认证该用户。authenticate()在用户上设置一个属性,注意哪个认证后端成功验证了该用户(有关详细信息,请参阅后端文档),以及此信息以后在登录过程中需要。如果你试图登入一个直接从数据库中取出的用户,将会抛出一个错误。

2.logout()
若要登出一个已经通过django.contrib.auth.login()登入的用户,在你的视图中使用django.contrib.auth.logout()。 它接收一个HttpRequest对象且没有返回值.

from django.contrib.auth import logout
def logout_view(request):
    logout(request)
    # Redirect to a success page.

注意: 即使用户没有登入,logout()也不会抛出任何错误。
当你调用logout()时,当前请求的会话数据将被完全清除。所有存在的数据都将清除。
3.在模板中判断用户是否登录
request对象中有一个user属性, request.user
如果用户已登录:
request.user是一个认证用户模型类(User)的对象,包含用户的信息,
可以直接使用user.username user.email等等
如果用户未登录:
request.user是一个匿名用户类(AnonymousUser)的对象
user.is_authenticated:
已登录的User类的user.is_authenticated这个方法永远返回的是True
未登录的AnonymousUser类user.is_authenticated这个方法永远返回False
所以在模板文件中可以直接使用一个模板变量user,实际上就是request.user

django 内置login_required装饰器的使用(只允许登录的用户访问¶)

  1. URLconf中装饰
from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView
 
from .views import VoteView
 
urlpatterns = [
 url(r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
 url(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
]
  1. 装饰基于函数的视图
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
 
@login_required
def my_view(request):
 if request.method == 'GET':
  # <view logic>
  return HttpResponse('result')
  1. 装饰类的视图:需要导入method_decorator
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
 
class ProtectedView(TemplateView):
 template_name = 'secret.html'
 
 @method_decorator(login_required)
 def dispatch(self, *args, **kwargs):
  return super(ProtectedView, self).dispatch(*args, **kwargs)
  1. 装饰通过Mixin类继承来实现
from django.contrib.auth.decorators import login_required
 
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.views.generic import View
 
from .forms import MyForm
 
class LoginRequiredMixin(object):
 @classmethod
 def as_view(cls, **initkwargs):
  view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
  return login_required(view)
 
class MyFormView(LoginRequiredMixin, View):
 form_class = MyForm
 initial = {'key': 'value'}
 template_name = 'form_template.html'
 
 def get(self, request, *args, **kwargs):
  form = self.form_class(initial=self.initial)
  return render(request, self.template_name, {'form': form})
  
 def post(self, request, *args, **kwargs):
  # code here

设置Django框架的缓存, 将session存储到redis

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # 设置django缓存的数据保存在redis数据库中
        "LOCATION": "redis://127.0.0.1:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
# Django的session存储设置到redis
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 设置session信息存储在CACHES配置项default对应的redis中
SESSION_CACHE_ALIAS = "default"

------------------分割线-------------
直接使用celery发送邮件的方式


0.准备工作
-0.1创建deme项目
django-admin start-project demo
进入项目目录: cd demo
-0.2 创建应用user
python manage.py startapp user

1.创建一个目录存放tasks.py

image.png
tasks.py文件
# 导入Celery类
from celery import Celery
from django.core.mail import send_mail

# 初始化django运行所以来的环境变量
# 这两行代码在启动worker一端打开
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings") #
# 或者这样设置,两个都可以
# os.environ['DJANGO_SETTINGS_MODULE'] = 'dailyfresh.settings'

#创建celery类的对象
app = Celery('celery_tasks.tasks',broker='redis://127.0.0.1:6379/7')

# 封装任务函数
@app.task
def my_task(subject, message, from_email, receiver, html_message):
    # 模拟send_mail发送邮件时间
    import time
    time.sleep(5)
    send_mail(subject, message, from_email, receiver, html_message=html_message)

2.在views.py视图文件中调用任务执行

def send(request):
  send_mail(subject='邮件标题',
                     message='邮件html会转义正文',
                     from_email='发件人邮箱',
                     recipient_list='收件人邮箱列表',
                     html_message='html不转义正文')

  from celery_tasks import tasks # 导入tasks
  tasks.my_task.delay(subject, message, from_email, receiver, html_message=html_message)

3.配置应用urls.py(可以调用到视图函数的urls文件)

from django.conf.urls import url
from user import views
urlpatterns = [
    # url(r'^$', views.send, name='send'), 
]

4.进入项目目录再启动celery worker
celery -A celery_tasks.tasks worker -l info

5.启动redis
redis-server 加配置文件

6.打开浏览器访问网址
127.0.0.1:8000

相关文章

网友评论

      本文标题:django-用户认证系统(注册,登录,校验,celery发送邮

      本文链接:https://www.haomeiwen.com/subject/ltdbfftx.html