RBAC在Django中基于中间件的AJAX应用案例
项目文件:
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here. class UserInfo(AbstractUser):
role=models.ManyToManyField(to='Role',verbose_name='角色',null=True,blank=True)
def __str__(self):
if self.role:
return f'{self.username}({self.role.name})'
else:
return f'{self.username}(未分配)' class Role(models.Model):
name=models.CharField(max_length=32,verbose_name='角色名称')
permission=models.ManyToManyField(to='Permission',verbose_name='权限')
def __str__(self):
return self.name class Permission(models.Model):
name=models.CharField(max_length=32,verbose_name="权限")
url=models.CharField(max_length=64,verbose_name='url')
def __str__(self):
return self.name
models.py
middlewares.py(自定义中间件)
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect,HttpResponse
import re
class AuthPerminssion(MiddlewareMixin):
def process_request(self,request):
url=['/admin/.*','/register/','/login/']
for i in url:
if re.match(i, request.path):
return None
else:
if request.user.is_authenticated: for url in request.session.get('permission'):
print(request.path)
print(request.session.get('permission'))
if re.match(f'{url}$',request.path):
#if re.search(f'^{url}$',request.path):
return None
else:
return HttpResponse('无权访问!')
else:
return redirect('login')
middlewares.py
settings.py(中间件注册和auth表指定)
MIDDLEWARE=[
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'app01.middlewares.AuthPerminssion',
] AUTH_USER_MODEL='app01.UserInfo'#配置自定义auth认真表 STATIC_URL='/static/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static_files')
]
settings.py
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^register/', views.Register.as_view(), name='register'),
url(r'^login/', views.Login.as_view(), name='login'), url(r'^order/$', views.order, name='order'),
url(r'^order/add/', views.addorder, name='addorder'),
url(r'^order/edit/(\d+)', views.editorder, name='editorder'),
url(r'^order/delete/(\d+)', views.deleteorder, name='deleteorder'), url(r'^customer/$', views.customer, name='customer'),
url(r'^customer/add/', views.addcustomer, name='addcustomer'),
url(r'^customer/edit/(\d+)', views.editcustomer, name='editcustomer'),
url(r'^customer/delete/(\d+)', views.deletecustomer, name='deletecustomer'), ]
urls.py
form.py(自定义form组件)
from app01 import models
from django import forms
from django.core.exceptions import ValidationError #注册form
class RegisterForm(forms.Form):
name = forms.CharField(label='用户名',max_length=12, min_length=8,required=True,
error_messages={
'max_length':'用户名不能多于12个字符',
'min_length':'用户名不能少于8个字符!',
'required':'用户名不能为空!',
},# widget=forms.TextInput(attrs={'type':'text','class':'form-control'}) ) password=forms.CharField(label='密码',max_length=8,min_length=6required=True,
error_messages={
'max_length': '密码不能多于8个字符',
'min_length': '密码不能少于6个字符!',
'required': '密码不能为空!',
},
widget=forms.PasswordInput(attrs={},render_value=True) )
r_password = forms.CharField( label='确认密码', max_length=8, min_length=6, required=True,
error_messages={
'max_length': '密码不能多于8个字符',
'min_length': '密码不能少于6个字符!',
'required': '密码不能为空!',
}, widget=forms.PasswordInput(attrs={},render_value=True) )
def clean_name(self):
if models.UserInfo.objects.filter(username=self.cleaned_data.get('name')):
raise ValidationError('当前用户已存在!')
else:
return self.cleaned_data.get('name')
def clean(self):
pwd=self.cleaned_data.get('password')
r_ped=self.cleaned_data.get('r_password')
if pwd!=r_ped:
self.add_error('r_password','两次密码输入不一致!')
else:
return self.cleaned_data
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs.update({'class': 'form-control'}) #登录modelform
class LoginModelForm(forms.ModelForm):
class Meta:
model=models.UserInfo
fields=['username','password']
labels={ 'username':'用户名','password':'密码'}
error_messages={'username':{'required':'用户名不能为空!'},
'password':{'required':'密码不能为空!'},},
widgets={'password':forms.PasswordInput(),}
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for field in self.fields:
self.fields[field].widget.attrs.update({'class': 'form-control'})
form.py
views.py
from django.shortcuts import render,HttpResponse
from django.views import View
from app01.form import RegisterForm,LoginModelForm
from django.contrib import auth
from app01.models import UserInfo,Permission # Create your views here. class Register(View):
def get(self,request):
register_formobj=RegisterForm()
return render(request,'register.html',{'register_formobj':register_formobj,})
def post(self,request):
register_obj=RegisterForm(request.POST)
if register_obj.is_valid():
print(register_obj.cleaned_data)
name=register_obj.cleaned_data.get('name')
pwd=register_obj.cleaned_data.get('password')
user_obj=UserInfo.objects.create_user(username=name,password=pwd)
return HttpResponse('ok')
else:
return render(request,'register.html',{'register_formobj':register_obj,})
class Login(View):
def get(self,request):
login_formobj=LoginModelForm()
return render(request,'login.html',{'login_formobj':login_formobj})
def post(self,request):
print(request.POST)
user_obj = auth.authenticate(username=request.POST.get('username'),password=request.POST.get('password'))
if user_obj:
auth.login(request, user_obj)
permission_url_list=[i.url for i in Permission.objects.filter(role__userinfo__pk=request.user.pk)]
request.session['permission']=permission_url_list
return HttpResponse('login successed!')
else:
return HttpResponse('login failed!') def order(request):
return HttpResponse('order...')
def addorder(request):
return HttpResponse('addorder...')
def editorder(request,pk):
return HttpResponse('editorder...')
def deleteorder(request,pk):
return HttpResponse('deleteorder...') def customer(request):
return HttpResponse('customer...')
def addcustomer(request):
return HttpResponse('addcustomer...')
def editcustomer(request,pk):
return HttpResponse('editcustomer...')
def deletecustomer(request,pk):
return HttpResponse('deletecustomer...')
views.py
Templates
register.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<title>注册</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-4 col-xs-offset-4">
<form action="" method="post" novalidate>
{% for field in register_formobj %}
<div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
<span class="text-danger">{{ field.errors.0 }}</span>
</div>
{% endfor %}
{% csrf_token %}
<input type="submit" class="btn btn-primary pull-right" value="注册">
</form>
</div>
</div>
</div>
</body>
<script src="{% static 'jquery-3.4.1.js' %}"></script>
<script src="{% static 'jquery-cookie-1.4.1.js' %}"></script>
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</html>
register.html
login.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<title>login</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-4 col-xs-offset-4">
<form action="" method="post" novalidate>
{% for field in login_formobj %}
<div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
<span class="text-danger">{{ field.errors.0 }}</span>
</div>
{% endfor %}
{% csrf_token %}
<input type="submit" class="btn btn-primary pull-right" value="登录">
</form>
</div>
</div>
</div>
</body>
<script src="{% static 'jquery-3.4.1.js' %}"></script>
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</html>
login.html
RBAC在Django中基于中间件的AJAX应用案例的更多相关文章
- 在django中解决跨域AJAX
由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接收罢了. 浏览器同源 ...
- Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',
1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...
- Django中Middleware中间件
Django中Middleware中间件 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法.实际上当 ...
- Django中的中间件(middleware)
中间件: 在研究中间件的时候我们首先要知道 1 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Djang ...
- Django 中的中间件
Django 中的中间件 Django 中间件 中间件介绍 前戏 之前在判断登录的时候使用的是装饰器的功能,通过给视图函数加装饰器来增加判断是否登录的功能.但此方法的缺点是必须给每个需要判断登录的视 ...
- [Django高级]理解django中的中间件机制和执行顺序
原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...
- django中的中间件
中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责 ...
- django中通过文件和Ajax来上传文件
一.通过form表单来上传文件 1.在html模板中 <form action="/index/" method="post" enctype=" ...
- Python Django 之 基于JQUERY的AJAX 登录页面
一.基于Jquery的Ajax的实现 1.url 2.vews 3.templates
随机推荐
- Springboot以Tomcat为容器实现http重定向到https的两种方式
1 简介 本文将介绍在Springboot中如何通过代码实现Http到Https的重定向,本文仅讲解Tomcat作为容器的情况,其它容器将在以后一一道来. 建议阅读之前的相关文章: (1) Sprin ...
- Android Studio快捷键动态演示
Android Studio出来很久了,大部分已经转过来了,相对于Eclipse又是毋庸置疑,更好的使用快捷键必定达到事半功倍的效果. 友情提示:某些电脑按F1-F12键需要先按住FN,比如我的Mac ...
- Nginx入门及如何反向代理解决生产环境跨域问题
1.Nginx入门与基本操作篇 注:由于服务器是windows系统,所以本文主要讲解Nginx在windows下的操作. 首先下载Nginx 解压缩,我们所有的配置基本都在万能的 nginx/conf ...
- 通过express框架为前端提供api(数据),妈妈再也不用担心后端不给我数据了~
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 首先,确保自己安装了express框架. 没有安装的同学可以参照下面这篇博 ...
- 8种MySQL分页方法总结
这篇文章主要介绍了8种MySQL分页方法总结,小编现在才知道,MySQL分页竟然有8种实现方法,本文就一一讲解了这些方法,需要的朋友可以参考下 MySQL的分页似乎一直是个问题,有什么优化方法吗?网上 ...
- 数论--HDU 1495 非常可乐
Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和se ...
- 图论--DFS总结
1.Key word:①双向DFS ②回溯 今天就看到了这么多DFS,其实DFS更倾向于枚举所有情况. 对于双向DFS,我们考虑看看最短路,起点做一下搜索,记录一下到所有点的距离,终点做一下搜索,记 ...
- docker-compose安装rabbitmq
编写时间:2020-05-08 参考文档:docker安装rabbitmq 1. 编写docker-compose.yml version: '3' services: rabbitmq: image ...
- Vue实现靠边悬浮球(PC端)
我想把退出登录的按钮做成一个悬浮球的样子,带动画的那种. 实现是这个样子: 手边没有球形图.随便找一个,功能这里演示的为单机悬浮球注销登录 嗯,具体代码: <div :class="[ ...
- 【Scala】代码实现Actor多种需求
文章目录 简单实现Actor并发编程 使用Actor实现发送没有返回值的异步消息 使用Actor实现不间断消息发送 用react方法替代receive方法接收消息 结合case class,通过匹配不 ...
