潭州课堂25班:Ph201805201 django 项目 第三十五课 后台用户权限的添加 mixins 课堂笔记)
验证用户登录:
对一个视图函数进行登录权限验证,(登录后才可以访问,否则重定向到登录页面)
#from django.contrib.auth.decorators import login_required
# @login_required(login_url='news:login')
# def index(request):
# return 对一个类视图进行登录权限验证,(登录后才可以访问,否则重定向到登录页面)
# @method_decorator(login_reqirde(login_url='news:login', name='dispatch))
# class Index(View):
# def get(self, request):
# pass 导入
from django.contrib.auth.mixins import LoginRequiredMixin
继承 LoginRequiredMixin
设定 login_url 重定向参数

也可以在主目录下的配置文件中设置,(只设置一次,以后不必再设置)、
在末行添加:LOGIN_URL = 'USERS:LOGIN' 用户权限管理:
from django.contrib.auth.decorators import permission_required
对新闻删除进行权限管理,,返回403
@permission_required('news:delete_news', raise_exception=True )
def index(request):
pass
在类中使用:
from django.contrib.auth.mixins import PermissionRequiredMixin
PermissionRequiredMixin 一定要在左边
class Index(PermissionRequiredMixin, View):
# 指定权限 在 auth 权限表中的增,删,改,查
permission_required = ('news:add_tag', 'news:view_tag')
# 如果没有权限,报403异常
raise_exception=True
def get(self, request):
pass 为实力添加权限管理
import json
import logging from django.shortcuts import render
from django.views import View
from django.db.models import Count # django自带的计算
# from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.auth.decorators import permission_required from ..news import models # 导入相关数据库
from utils.json_fun import to_json_data
from utils.res_code import Code,error_map logger = logging.getLogger('django') class Index(LoginRequiredMixin, View):
'''
创建 admin 主页视图
'''
login_url = 'users:login'
def get(self, request):
return render(request, 'admin/index/index.html') class TagManager(PermissionRequiredMixin, View):
'''
创建标签管理视图
/admin/tags/
'''
# 指定权限 在 auth 权限表中的增,删,改,查
permission_required = ('news:add_tag', 'news:view_tag')
# 如果没有权限,报403异常
raise_exception=True def get(self, request):
# 查询新闻分类表 did,类名,及类下的新闻文章总数
# 跟上条件:没有被逻辑删除的,排序:文章总数,修改时间,
tags = models.Tag.objects.values('id', 'name').annotate(num_news=Count('news')).\
filter(is_delete=False).order_by('-num_news', '-update_time') return render(request, 'admin/news/tags_manage.html', locals()) def post(self, request):
'''
添加新标签
:param request:
:return:
'''
json_data = request.body
if not json_data:
return to_json_data(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR])
# 将 json 转化为 dict
dict_data = json.loads(json_data.decode('utf8'))
tag_name = dict_data.get('name')
# 清洗去空格
if tag_name:
tag_name = tag_name.strip()
# 如果存在,取出来,如果不存在,创建一个
# 返回是个元祖
tag_up = models.Tag.objects.get_or_create(name=tag_name)
# tag_bole 第二个元素如果是 False,说明 name 存在,并取出
# 如果是 True 创建
# tag_inst 查询集
tag_inst, tag_bole = tag_up # 来着构造一个字典
new_tag_dist = {
'id':tag_inst.id,
'name':tag_inst.name
} # if tag_bole:
# return to_json_data(errmsg='标签创建成功', data=new_tag_dist)
# else: to_json_data(errno=Code.DATAEXIST, errmsg='标签已存在')
# 等于如下语句
return to_json_data(errmsg='标签创建成功', data=new_tag_dist) if tag_bole else \
to_json_data(errno=Code.DATAEXIST, errmsg='标签已存在') else:return to_json_data(errno=Code.PARAMERR, errmsg='标签名不能为空') class TagEdit(PermissionRequiredMixin, View):
'''
删除,更改,标签类
/admin/tags
'''
permission_required = ('news:add_tag', 'news:view_tag')
# 如果没有权限,报403异常
raise_exception=True def delete(self, request, tag_id):
# 删除
tag = models.Tag.objects.only('id').filter(is_delete=False, id=tag_id).first()
if tag:
# tag.delete() # 真的删除
# 逻辑删除
tag.is_delete = True
# tag.save()
tag.save(update_fields=['is_delete']) # 优化措施:只对指定字段保存
return to_json_data(errmsg='标签删除成功')
else:
return to_json_data(errno=Code.PARAMERR,errmsg='您要删除的标签不存在') def put(self, request, tag_id):
'''
更改标签
:param request:
:return:
'''
# 拿到前台传来的参数
json_data = request.body
if not json_data:
return to_json_data(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR])
# 将 json 转化为 dict
dict_data = json.loads(json_data.decode('utf8'))
tag_name = dict_data.get('name') tag = models.Tag.objects.only().filter(id=tag_id).first()
if tag:
# 清洗去空格
if tag_name :
tag_name = tag_name.strip()
# 如果新命名的 name 在标签中不存在
if not models.Tag.objects.only('name').filter(name=tag_name).exists():
# 把新的 name 给存入
tag.name = tag_name
tag.save(update_fields=['name']) # 优化措施
return to_json_data(errmsg='标签更改成功')
else: return to_json_data(errno=Code.PARAMERR,errmsg='该标签已经存在')
else: return to_json_data(errno=Code.PARAMERR,errmsg='标签名不能为空')
else: return to_json_data(errno=Code.PARAMERR,errmsg='您要更改的标签不存在') # @login_required(login_url='news:login') # @permission_required('news:delete_news', raise_exception=True )
# def index(request):
# pass # class Index(PermissionRequiredMixin, View):
# def get(self, request):
# pass
潭州课堂25班:Ph201805201 django 项目 第三十五课 后台用户权限的添加 mixins 课堂笔记)的更多相关文章
- 潭州课堂25班:Ph201805201 django 项目 第三十四课 后台文章标签更新功能 ,创建功能实现(课堂笔记)
g更改标签:,前台要向后台传来 id, name, 对标签进行校验:标签不能为空,标签是否已经存在, 流程: def put(self, request, tag_id): ''' 更改标签 :par ...
- 潭州课堂25班:Ph201805201 django 项目 第三十二课 后台站点管理(课堂笔记)
一.后台站点模版抽取 1.获取静态站点模版 可以使用git clone到本地 git clone https://github.com/almasaeed2010/AdminLTE.git 也可以在g ...
- 潭州课堂25班:Ph201805201 django 项目 第三十九课 后台 文章发布,图片上传到 FastDFS后端实现 七牛云讲解(课堂笔记)
文章发布: # 1,从前台获取参数# 2,校验参数# 3,把数据保存到数据库# 4,返回执行结果到前台,(创建成功或失败) 自定义 froms.py 校验参数 上传图片到七牛云 注册 https:// ...
- 潭州课堂25班:Ph201805201 django 项目 第三十八课 后台 文章发布,FastDFS安装 配置(课堂笔记)
, .安装FastDFS # 从docker hub中拉取fastdfs镜像docker pull youkou1/fastdfs # 查看镜像是否拉取成功docker images # 安装trac ...
- 潭州课堂25班:Ph201805201 django 项目 第三十六课 后台文章管理(课堂笔记)
get 请求, 1,获取文章标签 , 2,拿到前台传来的值, 3,根据前台传来的值在数据库中查询 4.,返回数据到前台,渲染, 分页算法 : 在 utils 下创建 paginator_script ...
- 潭州课堂25班:Ph201805201 django 项目 第四十五课 mysql集群和负载均衡(课堂笔记)
2.使用docker安装Haproxy 一.为什么要使用数据库集群和负载均衡? 1.高可用 2.高并发 3.高性能 二.mysql数据库集群方式 三.使用docker安装PXC 1.拉取PXC镜像 d ...
- 潭州课堂25班:Ph201805201 django 项目 第四十二课 后台 课程相关,用户组管理 (课堂笔记)
在线课程: 当点击进入页面时,显示所有课程 def get(self, request): courses = Course.objects.select_related('category', 't ...
- 潭州课堂25班:Ph201805201 django 项目 第四十六课 查错 补缺 (课堂笔记
从讲项目开始,查找错误,完善笔记,尽可能 翻译没一句代码(以后台为主), 本项目亮点,也是重点 Django ORM中对数据查询的优化(only.defer.select_related) redis ...
- 潭州课堂25班:Ph201805201 django 项目 第四十四课 项目部署 (课堂笔记)
项目部署 稳定,并发,效益, 一.Django配置 1.settings.py配置 复制全局settings.py配置文件,创建一个副本命名为MyBlog/pro_settings.py,修改DEBU ...
随机推荐
- Python匿名函数(lambda)
result = lambda [arg1 [, arg2, .....]]:expression result:用于调用lambda表达式 [arg1 [, arg2, -]]:可选参数,用于传递参 ...
- php模拟数据请求
php:模拟后台接受数据的步骤<?php> 1.连接数据库 $host="localhost"; $uname="root"; $upwd=&quo ...
- Django_Admin操作
Django_Admin 创建Django_Admin 管理账户 D:\github\Django_Aadmin>python manage.py createsuperuser Usernam ...
- caffe调loss方法
正文 what should I do if... ...my loss diverges? (increases by order of magnitude, goes to inf. or NaN ...
- org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /eclipse20171118
1:如果有一天,你有幸看到了这个错误,也许你像我一样low,因为此时,你已经准备开发Zookeeper程序了,却还没有把Zookeeper的服务启动起来. org.apache.zookeeper.K ...
- [转] Form 表单数据处理 简单教程 formidable 使用心得
入门,高手见笑 表单数据一种是get方式, 另一种是post 方式 1.get方式 对于get方式,node处理起来非常简单 如以下代码: var urlParsed = url.parse(requ ...
- xcode svn commit is not under version control 和 git常用指令
使用Xcode提交一个第三方库时,由于包含资源文件,总是提交不了,提示报错:XXX commit is not under version control (1) 网上查了下,得知 xcode对于sv ...
- 【Android】Android 4.0 Launcher2源码分析——启动过程分析
Android的应用程序的入口定义在AndroidManifest.xml文件中可以找出:[html] <manifest xmlns:android="http://schemas. ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-2项目说明和源码下载
本文目录1. 摘要2. Window下运行 3.linux下运行4. 开发记录5. 总结 1.概要 写<Asp.Net Core 2.0 项目实战>系列断断续续已经很长时间了,期间很多朋友 ...
- 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...