django全局使用及用户登录模块实现

django - 1.9.8
python - 2.7

程序打头声明:# -*- coding: utf-8 -*-
pycharm 设置中 file and code template 可以编辑新建文件的模板
py文件中 __date__='$DATE $TIME'可以自动生成当前时间

PEP8 的规范:
import python自带
import 第三方
import自己定义的

空两行
若app过多 存放在一个文件下 不用search forreference 和 open moved file in editor 然后mark source root
setting。py :import sys
sys.path.insert(0,os.path.join(BASE_DIR,'目录名'))

srtting。py中修改框架 语言
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False数据存储时间设为本机
django目录
网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数。
处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,用户请求的数据,输出到网页。(功能实现)
与数据库操作相关,存入或读取数据时用到这个,当然用不到数据库的时候 你可以不使用。
templates 文件夹
views.py 中的函数渲染templates中的Html模板,得到动态内容的网页,当然可以用缓存来提高速度。
后台,可以用很少量的代码就拥有一个强大的后台。
Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等。
创建static文件夹 存放静态文件


django版本
Django 1.5.x 支持 Python 2.6.5 Python 2.7, Python 3.2 和 3.3.
Django 1.6.x 支持 Python 2.6.X, 2.7.X, 3.2.X 和 3.3.X
Django 1.7.x 支持 Python 2.7, 3.2, 3.3, 和 3.4 (注意:Python 2.6 不支持了)
Django 1.8.x 支持 Python 2.7, 3.2, 3.3, 3.4 和 3.5.  (长期支持版本 LTS)
Django 1.9.x 支持 Python 2.7, 3.4 和 3.5. 不支持 3.3 了
Django 1.10.x 支持 Python 2.7, 3.4 和 3.5. 
Django 1.11.x 支持 Python 2.7, 3.4, 3.5 和 3.6(长期支持版本 LTS) 最后一个支持 Python 2.7 的版本
Django 2.0.x 支持 Python 3.4, 3.5 和 3.6 (注意,不再支持 Python 2)


虚拟环境使用方法:
mkvirtualenv zqxt:创建运行环境zqxt
workon zqxt: 工作在 zqxt 环境 或 从其它环境切换到 zqxt 环境
deactivate: 退出终端环境


数据库
pip install mysql-python 一般会报错推荐使用https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python下载源码安装
navicat中创建新的数据库字符集utf8 排序规则utf8 general。ci
setting。py中DATABASES = {
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'webdb',
        'USER':'root',
        'PASSWORD':'1234',
        'HOST':'127.0.0.1'
    }
}
run maneger.py task 然后 makemigration创建默认数据表 migration生成数据表

run maneger.py task startapp 【app名】创建新的app
使用了image字段需要pip install pillow
model.py 中设计数据表例如
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50,verbose_name=u'昵称',default='')
image = models.ImageField(upload_to="image/%Y/%m",default=u"image/default.png",max_length=100)

新建
class EmailVerifyRecord(models.Model):
    code = models.CharField(max_length=20, verbose_name=u"验证码")
    email = models.EmailField(max_length=50, verbose_name=u"邮箱")
    send_type = models.CharField(verbose_name=u"验证码类型", choices=(("register",u"注册"),("forget",u"找回密码"), ("update_email",u"修改邮箱")), max_length=30)
    send_time = models.DateTimeField(verbose_name=u"发送时间", default=datetime.now)

    class Meta:
        verbose_name=u'邮箱验证码'
        verbose_name_plural = verbose_name


继承from django.contrib.auth.models import AbstractUser 拥有大部分必须字段 还可以添加

class UserProfile(AbstractUser):#已覆盖默认user表
    nick_name = models.CharField(max_length=50,verbose_name=u'昵称',default='')
    birthday = models.DateField(verbose_name=u"生日", null=True, blank=True)
    gender = models.CharField(max_length=6, choices=(("male", u"男"), ("female", "女")), default="female")
    address = models.CharField(max_length=100, default=u"")
    mobile = models.CharField(max_length=11, null=True, blank=True)
    image = models.ImageField(upload_to="image/%Y/%m",default=u"image/default.png",max_length=100)

setting.py中注册新的app

循环引用 循环import会出错 解决方法:分层设计
若app过多 存放在一个文件下 不用search forreference 和 open moved file in editor


搭建后台开发管理系统
新建超级用户createsuperuser: python manage.py createsuperuser
pip install xadmin 会自动下载依赖包(crispy_forms)推荐使用github下载源码包方便修改源码则需自己下载crispy_forms
setting.py中注册app :xadmin 和 crispy_forms
urls.py中:
import xadmin
urlpatterns = [
url(r'^xadmin/', xadmin.site.urls),
]
还需额外pip的包future django-import-export six
之后重新 makemigration创建默认数据表 migration生成数据表

app下新建adminx.py文件
import xadmin
注册数据表 例如
class EmailVerifyRecordAdmin(object):
pass
xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin)

常用全局设置from xadmin import views
class GlobalSetting(object):
    site_title=u'后台管理系统'
    site_footer=u'YZH LAB'
    menu_style='accordion'#合并app数据表
xadmin.site.register(views.CommAdminView,GlobalSetting)
常用查找功能 写在adminx.py中
list_display=['code','email','send_type','send_type']
search_fields = ['code','email','send_type']#搜索框
list_filter =['code','email','send_type','send_type']#过滤器
常用主题设置
class BaseSetting(object):
enable_themes = True
use_booswatch = True

修改app名:app.py文件中加入 verbose_name = u'中文名'
__init__.py中加入 default_app_config = 'users.apps.UsersConfig'


url配置:
from django.views.generic import TemplateView
url(r'^$', TemplateView.as_view(Template_name='index.html'),name='index'),//首页
url('^login/$', LoginView.as_view(), name="login"),
前端全局配置:
静态文件加载全改为
{% load staticfiles %}
href="{% static 'font-awesome-4.5.0/css/font-awesome.min.css' %}">
<script src="{% static 'js/jquery-1.11.3.min.js' %}"></script>

有关url的改为
href="{% url 'login' %}">

static配置:

setting中
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"static"),
)
因为是元组必须加逗号
html中的herf=“/login/”即可跳转
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">


要写自己的后台逻辑需要添加自己的view
from users.views import login
url(r'^login/$',login,name='login'),

from users.views import LogoutView,
url('^login/$', LoginView.as_view(), name="login"),

{% csrf_token %}
加在html表单之前 防止csrf攻击

from django.contrib.auth import authenticate#内置认证模块,认证密码与用户名正确才能登陆

form的action指向必须/xxx/ 单边/会报错

基于类方法做功能很重要
from django.views.generic.base import View
class LoginView(View):

创建forms.py 用于预处理用户提交的表单例如判断是否正确
from django import forms
class LoginForm(forms.Form):

html中的input。name必须与forms.py 的变量名称相同

password = forms.CharField(required=True,min_length=6)
限制最小长度可以减轻数据库负担
错误提示 html:{% if login_form.errors.username %}errorput{% endif %}>
<form action="/login/" method="post" autocomplete="off">
    <input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
    <div class="form-group marb20 {% if login_form.errors.username %}errorput{% endif %}">
        <label>&nbsp;&nbsp;</label>
        <input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
    </div>
    <div class="form-group marb8 {% if login_form.errors.password %}errorput{% endif %}">

条件用{% if xxx %} 变量用{{ xx }}

建议使用 不然前端跳转很混乱
view.py:class LoginView(View):
from users.views import LoginView
urls.py:url(r'^login/$',LoginView.as_view(),name='login'),
html:<a class="index-font" href="{% url 'index' %}">回到首页</a>


pip install django-simple-captcha==0.4.6 注意版本
Add captcha to the INSTALLED_APPS in your settings.py
Run python manage.py migrate
Add an entry to your urls.py:
urlpatterns += [ url(r'^captcha/', include('captcha.urls')),]


易错点:return render(request,'register.html',{'register_form':register_form})

才可以在html中调用register_form的变量

用户注册流程:
1写一个注册的view:重写get 和post方法
class RegisterView(View):
    def get(self,request):
        register_form =RegisterForm()
        return render(request,'register.html',{'register_form':register_form})

    
def post(self,request):
    register_form = RegisterForm(request.POST)
    if register_form.is_valid():
        user_name = request.POST.get("email", "")
#防止注册相同用户名
        if UserProfile.objects.filter(email=user_name):
            return render(request, 'register.html', {'register_form': register_form,'msg':u'用户已存在'})
2实例数据库对象 对数据进行操作 例如保存密码和用户名
2.1对密码进行密文加密
from django.contrib.auth.hashers import make_password
user_profile.password = make_password(pass_word)

3邮箱发送激活链接
3.1因为要操作邮箱 再新建一个邮箱操作的app (utils) 在创建一个py文件建议命名email_send.py
3.2写一个发送函数
from django.core.mail import send_mail
from users.models import EmailVerifyRecord
from yzhweb.settings import EMAIL_FROM


def send_register_email(email,send_type='register'):
    email_record = EmailVerifyRecord()
    code = generate_random_str(16)
    email_record.code=code
    email_record.email = email
    email_record.send_type=send_type
    email_record.save()

    email_title=''
    email_body=''

if send_type=='register':
    email_title='yzhlab注册激活链接'
    email_body='请点击下面的链接激活账号:http://127.0.0.1:8000/active/{0}'.format(code)
    send_status=send_mail(email_title,email_body,EMAIL_FROM,[email])
3.3写一个生成激活码函数
from random import Random

def generate_random_str(randomlength=8):
    str=''
    chars='AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    length = len(chars)-1
    random = Random()
    for i in range(randomlength):
        str=str+chars[random.randint(0,length)]
    return str

3.4setting.py中配置发送邮箱的配置(进入邮箱客户端的客户端开启服务状态)
EMAIL_HOST = 'smtp.sina.com' #进入客户端查 一般是这种形式
EMAIL_PORT = 25 #默认
EMAIL_HOST_USER = '邮箱地址'
EMAIL_HOST_PASSWORD = '123456aa'
EMAIL_USER_TLS = False #默认
EMAIL_FROM = '邮箱地址'
3.5在view.py中调用utils的发送函数
3.6处理用户激活的url
url(r'^active/(?P<active_code>.*)/$',ActiveUserView.as_view(),name='user_active')

class ActiveUserView(View):
    def get(self,request,active_code):
        all_records = EmailVerifyRecord.objects.filter(code=active_code)
        if all_records:
            for record in all_records:
                email = record.email
                user = UserProfile.objects.get(email=email)
                user.is_active = True
                user.save()
        else:
             return render(request, 'active_fail.html')#验证失败的返回

3.7新建一个提示连接失效的html,保证用户体验


4忘记密码
4.1 配置一个找回密码的url
url(r'^forgetpwd/$', ForgetpwdView.as_view(), name='forget_pwd'),

4.2写一个忘记密码的view:重写get 和post方法
class ForgetpwdView(View):
    def get(self,request):
        forgetpwd_form = ForgetpwdForm()
        return render(request,'forgetpwd.html',{'forgetpwd_form':forgetpwd_form})

    def post(self,request):
        forgetpwd_form = ForgetpwdForm(request.POST)

4.3创建忘记密码的form在form.py 参考注册的form,几乎一样
4.4完善post的逻辑
def post(self,request):
    forgetpwd_form = ForgetpwdForm(request.POST)
    if forgetpwd_form.is_valid():
        email = request.POST.get('email','')
        send_register_email(email, 'forget')
        return render(request, 'send_success.html')
    else:
        return render(request, 'forgetpwd.html', {'forgetpwd_form': forgetpwd_form})
4.5添加忘记密码的邮箱发送内容
elif send_type == 'forget':
    email_title = 'yzhlab密码重置链接'
    email_body = '请点击下面的链接重置你的密码:http://127.0.0.1:8000/reset/{0}'.format(code)
    send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])

4.6重设密码
class ResetView(View):
    def get(self,request,active_code):
        all_records = EmailVerifyRecord.objects.filter(code=active_code)
        if all_records:
            for record in all_records:
                email = record.email
                return render(request, 'password_reset.html',{'email':email})
        else:
            return render(request, 'active_fail.html')
        return render(request,'login.html')

4.7添加对应的 form.py内容 和url配置

5注销(django内置注销功能)
from django.contrib.auth import logout

class LogoutView(View):
    def get(self,request):
        logout(request)
        return HttpResponseRedirect(reverse('index'))

这基本完成登录-注册-忘记密码-修改密码模块

            
阅读更多
下一篇mqtt入门(消息收发demo)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭