python写crm_Python CRM项目八
自定义用户认证
目的:实现Django自定义的认证系统,在生产环境都是根据此代码进行定制的
步骤:
1.在settings文件中配置要使用的类
#命名规则 app名称.类名
AUTH_USER_MODEL = 'crm.UserProfile'
2.在crm app下的models文件中加入Django官方的用户认证
from django.contrib.auth.models import(
BaseUserManager, AbstractBaseUser,PermissionsMixin
)from django.utils.safestring importmark_safefrom django.utils.translation importugettext_lazy as _classUserProfileManager(BaseUserManager):def create_user(self, email, name, password=None):
#创建用户根据UserProfile中的字段,输入if notemail:raise ValueError('Users must have an email address')
user=self.model(
email=self.normalize_email(email),
name=name,
)
user.set_password(password)
user.save(using=self._db)returnuserdefcreate_superuser(self, email, name, password):
#创建超级用户根据UserProfile中的字段,输入
user=self.create_user(
email,
password=password,
name=name,
)
user.is_admin=True
user.save(using=self._db)returnuserclassUserProfile(AbstractBaseUser,PermissionsMixin):
#使用Django自带的登录系统,可以自定义一些字段,例如邮箱,密码,用户名
email=models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
password= models.CharField(_('password'), max_length=128,help_text = mark_safe('修改密码'))
name= models.CharField(max_length=32)
is_active= models.BooleanField(default=True)
is_admin= models.BooleanField(default=False)
#在创建用户的时候调用该方法进行用户的创建
objects=UserProfileManager()
USERNAME_FIELD= 'email'REQUIRED_FIELDS= ['name']defget_full_name(self):#The user is identified by their email address
returnself.emaildefget_short_name(self):#The user is identified by their email address
returnself.emaildef __str__(self): #__unicode__ on Python 2
returnself.emaildef has_perm(self, perm, obj=None):"Does the user have a specific permission?"
#Simplest possible answer: Yes, always
returnTruedefhas_module_perms(self, app_label):"Does the user have permissions to view the app `app_label`?"
#Simplest possible answer: Yes, always
returnTrue
@propertydefis_staff(self):"Is the user a member of staff?"
#Simplest possible answer: active users are staff
returnself.is_activeclassMeta:
verbose_name_plural= '用户'
3.在crm app下的admin中
from django importformsfrom django.contrib.auth.models importGroupfrom django.contrib.auth.admin importUserAdmin as BaseUserAdminfrom django.contrib.auth.forms importReadOnlyPasswordHashField
fromcrm.modelsimport UserProfileclassUserCreationForm(forms.ModelForm):
#在Django Admin页面中用户创建的表单展示"""A form for creating new users. Includes all the required
fields, plus a repeated password."""password1= forms.CharField(label='Password', widget=forms.PasswordInput)
password2= forms.CharField(label='Password confirmation', widget=forms.PasswordInput)classMeta:
#展示的model对象和字段
model=UserProfile
fields= ('email', 'name')defclean_password2(self):
#判断两次输入的密码是否一致#Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2= self.cleaned_data.get("password2")if password1 and password2 and password1 !=password2:raise forms.ValidationError("Passwords don't match")returnpassword2def save(self, commit=True):
#保存用户到数据库#Save the provided password in hashed format
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])ifcommit:
user.save()returnuserclassUserChangeForm(forms.ModelForm):
#在Django Admin页面中用户修改的表单展示"""A form for updating users. Includes all the fields on
the user, but replaces the password field with admin's
password hash display field."""password=ReadOnlyPasswordHashField()classMeta:
#展示的model对象和字段
model=UserProfile
fields= ('email', 'password', 'name', 'is_active', 'is_admin')defclean_password(self):#Regardless of what the user provides, return the initial value.
#This is done here, rather than on the field, because the
#field does not have access to the initial value
return self.initial["password"]classUserProfileAdmin(BaseUserAdmin):
#在在Django Admin页面中配置的admin_class#The forms to add and change user instances
form =UserChangeForm #调用修改用户的表单
add_form=UserCreationForm #调用创建用户的表单#The fields to be used in displaying the User model.
#These override the definitions on the base UserAdmin
#that reference specific fields on auth.User.
list_display = ('email', 'name', 'is_admin')
list_filter= ('is_admin',)
fieldsets=(
(None, {'fields': ('email', 'password')}),
('Personal info', {'fields': ('name',)}),
('Permissions', {'fields': ('is_admin','is_active','user_permissions',)}),
)#add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
#overrides get_fieldsets to use this attribute when creating a user.
add_fieldsets =(
(None, {'classes': ('wide',),'fields': ('email', 'name', 'password1', 'password2')}
),
)
search_fields= ('email',)
ordering= ('email',)
filter_horizontal= ('groups','user_permissions')
admin.site.unregister(Group)
#把models对象中的model对象和admin_class对象组合起来
admin.site.register(models.UserProfile,UserProfileAdmin)
4.在king_admin中实现修改密码的功能
在king_admin的urls.py中配置
url(r'^(\w+)/(\w+)/(\d+)/change/password/$',views.password_reset,name='password_reset'),
在king_admin中的king_admin.py中配置
classUserAdmin(BaseAdmin):
list_display= ['email','name'] #首页展示的字段
readonly_fields= ['password',] #只读字段
modelfrom_exclude_fields= ['last_login','is_superuser','groups','user_permissions'] #不展示的字段
在views函数中开发该模块
defpassword_reset(request,app_name,table_name,obj_id):'''动态修改密码'''
#获取admin_class类和要修改密码的对象admin_class=king_admin.enabled_admins[app_name][table_name]
model_obj= admin_class.model.objects.get(id=obj_id)
errors={}if request.method == 'POST':
#获取前端页面的两个值,密码和新密码
_password1= request.POST.get('password1')
_password2= request.POST.get('password2')
#如果两次密码相同,并且长度大于5位,则调用父类的方法保存密码,同时入库,最后返回到展示页面if _password1 ==_password2:if len(_password2) > 5:
model_obj.set_password(_password1)
model_obj.save()
#保存成功则跳转到展示页面进行展示return redirect(request.path.rstrip('password/'))else:
errors['invalid_password'] = '密码长度不足6位'
else:
errors['invalid_password'] = '两次密码不一致'
return render(request,'king_admin/password_reset.html',{'model_obj':model_obj})
5.在forms.py中将不需要展示的字段写到exclude上
classMeta:
model=admin_class.model
fields= '__all__'exclude= admin_class.modelfrom_exclude_fields #排除的字段
6.前端页面
本质上是一个form表达,展示用户的用户名,然后用户填写密码和新密码之后提交到views的方法中进行修改密码的操作
{% extends 'king_admin/table_index.html' %}
{% block container %}
重置用户{{ model_obj.name }}密码
用户名:
密码:
重复密码:
- {% for k,v in errors.items %}
- {{ k }}-{{ v }}{% endfor %}
{% endblock %}
自定义用户登录
目的:利用Django提供的组件,实现自己的用户认证系统,包括登录,登出和利用装饰器实现方法的登录校验
1.在settings文件中配置登录url的路径
LOGIN_URL = '/'
2.在入口的app中配置url
3.在views中开发登录,登出和首页的模块
from django.shortcuts importrender,redirectfrom django.contrib.auth importlogin,authenticate,logout#Create your views here.
defaccount_login(request):
errors={}if request.method == 'POST':
#获取前端表单的值
_email= request.POST.get('email')
_password= request.POST.get('password')
#使用Django自带的用户认证
user= authenticate(username=_email,password=_password)ifuser:
#登录成功则进行跳转,如果有next_url则跳转到下一个页面,否则跳转到首页
login(request,user)
next_url= request.GET.get('next','')ifnext_url:returnredirect(next_url)else:return redirect('/index/')else:
errors['error'] = '用户名密码不正确'
return render(request,'login.html',{'errors':errors})defaccount_logout(request):
#用户登出
logout(request)return redirect('/account/login/')defindex(request):return render(request,'index.html')
4.在需要登录校验的方法上,加上@login_required装饰器
from django.contrib.auth.decorators importlogin_required
@login_requireddefindex(request):return render(request, 'king_admin/table_index.html',{'table_list':king_admin.enabled_admins})
5.前端页面,form表单以post的方式向后台发送用户名和密码,后端的views中相应的方法进行校验
{% extends 'base.html' %}
{% block body %}
登录CRM系统
python写crm_Python CRM项目八相关推荐
- python crm_Python CRM项目一
1 from django.db importmodels2 from django.contrib.auth.models importUser3 #Create your models here. ...
- python写一个crm系统_用Python打造一个CRM系统(四)
在上一篇中在本地进行初始化,并让项目顺利运行.在本篇中将实现一个线索管理模块,支持线索的增删改查. 新建线索应用模块 进入项目目录,使用django命令创建线索应用模块,命令如下: $ python ...
- 用python写一个NC(八)
基于TCP连接的远程控制木马 一.subprocess模块 subprocess模块允许我们启动一个新进程,并连接至它们的标准输入/输出/错误管道,从而获取返回值. 二.argparse模块 argp ...
- 除了 Python ,这些语言写的机器学习项目也很牛(二)
2019独角兽企业重金招聘Python工程师标准>>> Python 由于本身的易用优势和强大的工具库储备,成为了在人工智能及其它相关科学领域中最常用的语言之一.尤其是在机器学习,已 ...
- 八皇后问题的进化(4)-python写的八皇后
这是"Beginning Python From Novice to Professional"里用python写的八皇后,代码量很少,用到了生成器. python一直给我的感觉是 ...
- 【python小项目】用python写一个小工具——番茄钟
用python写一个小工具--番茄钟 最近听到朋友说在用番茄钟,有点兴趣也想下载一个来用用,后面仔细一想这玩意做起来也不难,索性自己顺手写一个算了,在这里也分享给大家了 一.功能简述 番茄钟即番茄工作 ...
- python小游戏编程实例-10分钟教你用Python写一个贪吃蛇小游戏,适合练手项目
另外要注意:光理论是不够的.这里顺便总大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交 ...
- python写的脚本怎么用,如何用python写脚本
如何用python写脚本 以Python2.7操作为例:1.首先需要打开电脑桌面,按开始的快捷键,点击Python2.7如图所示的选项进入. 相关推荐:<Python入门教程>2.打开之后 ...
- Python 的练手项目有哪些值得推荐?
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 今天要推荐一本非常著名的开源书籍:<500 Lines or ...
最新文章
- 刻意练习:LeetCode实战 -- Task24. 恢复二叉搜索树
- php 限制刷新,PHP禁止频繁刷新方法
- 设置RabbitMQ远程ip登录
- 一篇能涨薪水的JVM调优,分析文章
- 旋流式沉砂池计算_以高效旋流器为核心的超低成本选煤技术
- 想调试Angular框架的@HostBinding,应该在哪里设置断点
- 自动分页,返回时跳回指定页
- python字符串命名_python-字符串及其常用方法
- Java类初始化及实例化过程
- 理解PHP5中static和const关键字
- angular HttpClient getbyid 方法获取数据
- 如何在钉钉上开发自己的应用_对企业来说无代码开发平台是否安全
- ionic安装拍照选照片插件
- 频数直方图的步骤_超级详细的直方图应用步骤及分析,一篇搞定直方图!
- 全球网络波动实时监控系统--网动仪
- 业务流程管理(BPM)系统的九大必备特点
- selenium接管浏览器并配置代理
- 道琼斯200万高危人群名单泄露,从AWS上
- 通过网络安装CentOs7
- 证券公司信息化2-投资银行业务是做什么的,怎样赚钱,IT在里边起到什么作用?