搜尋
首頁後端開發Python教學Django使用者認證系統(三)群組與權限

Django的權限系統很簡單,它可以賦予users或groups中的users權限。

Django admin後台就使用了該權限系統,不過也可以用到你自己的程式碼中。

User物件有兩個ManyToManyField字段,groups和user_permissions

   groups = models.ManyToManyField(Group, ver  name=_('Trs'),
user> s  片to. A user will '
                               'get all permissions granted to each of '? 'their groups.'),
       related_name="user_set", related_query_name="user")
   user_permissions = models.ManyToManyField(Permission,username permissions = models.ManyToManyField(Permission,username_Permissions = name= ) permissions'), blank=True,
       help_text=_('Specific permissions for this user.'),
       related_name="user_set", related_djryname="şoango", relateds"

myuser.groups = [group_list]
myuser.groups.add(group, group, ...)

myuser.groups.remove(group, group, ...)

myuser.groups.clear()

myuser. user_permissions = [permission_list]

myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions..權限是作為一個Model存在的,建立一個權限就是建立一個Permission Model的實例。

@python_2_unicode_compatible
class Permission(models.Model):
   """
   The permissions system PRovides a way to assign permissions to specus 🜎 The permission system is used by the Django admin site, but may also be
   useful in your own code. The Django admin site uses permissions as follows:

       - The "add" permission

       - The "add" permission

       - The "add" permission

及an object.

       - The "change" permission limits a user's ability to view the change
         list, view the "change" form and change an object.
       - The "delete permission mission 錯誤       - The "delete permission mission mis值set globally per type of object, not per specific object
   instance. It is possible to say "Mary may change news stories," but it's
   not currently possible to say "Mary may change news stories, but only the
   ones she created herself" or "Mary may only change news stories。 CharField(_('name '), max_length=255)
   content_type = models.ForeignKey(ContentType)
   codename = models.CharField(_('codename'), max_length=100)
Managermis
       verbose_name = _( 'permission')
       verbose_name_plural = _('permissions')
       unique_together = (('content_type', 'codename'),) __% _p                   'codename')

   def __str__( 。           six.text_type(self.name))

   def natural_key(self):
       return (self.codename,) + self.content_type.natural_key()
   natural_key.dependencies = ['contenttypes。 50個字元或更少,例如,’Can Vote‘

content_type:必需,一個對於django_content_type資料庫table的引用,table中含有每個應用中的Model的記錄。

codename:必需,100個字元或更少,例如,'can_vote'。

如果要為某個Model建立權限:

from django.db import models

class Vote(models.Model):
  ...
   class Mmiscan:"mis misd "),)


如果這個Model在應用foo中,則權限表示為'foo.can_vote',檢查某個使用者是否具有權限myuser.has_perm('foo.can_vote')

預設權限如果已經在INSTALLED_APPS配置了django.contrib.auth,它會保證為installed applications中的每個Django Model建立3個缺省權限:add, change 和delete。

這些權限會在你第一次執行 manage.py migrate(1.7之前為syncdb) 時建立。當時所有的models都會建立權限。在這之後創建的新models會在再次運行 manage.py migrate時創建這些預設權限。這些權限與admin管理介面中的創建,刪除,修改行為是一一對應的。

假設你有一個應用foo ,其中有一個模型Bar, 你可以用下述方法來測試基本權限:

add: user.has_perm('foo.add_bar')

change: user.has_perm('foo. change_bar')

delete: user.has_perm('foo.delete_bar')

權限模型( Permission model)一般不直接使用。


組Groups

組也存在的Model:

@python_2_unicode_compatible

class Group(models.Model):

   """

  geneat​​ion

   """。   some other label, to those users. A user can belong to any number of
   groups.

   A user in a group automatically has all the permissions granted to that
group mis at the mission  orat, coo​​nectronw mis​​nable Smission Smis​​ity, 錯誤edit_home_page, any user in that group will have that permission.

   Beyond permissions, groups are a convenient way to categorize users to
   apply some label, or extended functionals function functionalh. and you could write code that would
   do special things to those users -- such as giving them access to a
   members-only portion of your site, or sending them s-only email   name = models.CharField(_ ('name'), max_length=80, unique=True)
   permissions = models.ManyToManyField(Permission,
       verbose_name=_('permissions'),      verbose_name=_('permissions'),    .
   class Meta:
verbose_name = _('group')
       verbose_name_plural = _('groups')

   def __str__(self):
selfself :        return (self.name,)


字段fields:

name:必需,80個字元或更少,例如, 'Awesome Users'。

permissions:ManyToManyField to Permission

permissions:ManyToManyField to Permission

group.permissions = [permission_list]
group.permissions.add(permission, permission, ...)
group.permission.removemission. .clear()


Programmatically creating permissions

除了可以使用Model meta來建立權限,也可以直接用程式碼建立。

例如,為myapp應用中的BlogPost模型建立一個can_publish權限:

from myapp.models import BlogPost

from django.contrib.auth.models import Group, Permission

from django.contrib.auth.models importb. content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(codename='can_publish',
         Can Publish Posts',
                                      content_type=content_type)

時賦予一個物件它的user_permissions屬性或賦予一個Group通過它的permissions屬性。

權限快取

User的權限檢查時是可以被快取的,如果一個新權限被賦予一個User,如果再立即檢查是不會被檢查出來的。最簡單的方法是重新fetch User物件。

from django.contrib.auth.models import Permission, User
from django.shortcuts import get_object_or_404

def user_gains_perms(request, user_id):user_obpid   #權限檢查會快取現在的權限集合
   user.has_perm('myapp.change_bar')

   permission = Permission.objects.get(codename='change_bar')
   user.user_permissions.user(permission) 緩存has_perm(' myapp.變bar')  # 真

   . ..


權限裝飾器

permission_required(perm[, login_url=None, raise_exception=False])

檢查使用者是否具有某個權限,類似於@login_required()

檢查使用者是否具有某個權限,類似於@login_required()
. import permission_required

@permission_required('polls.can_vote', login_url='/loginpage/')

def my_view(request):

   

在模板中的權限

. { perms }}中,是django.contrib.auth.context_processors.PermWrapper實例。


{{ perms.foo }}


上面的單一屬性是User.has_module_perms的代理。如果user擁有foo中的任一權限,則為True

{{ perms.foo.can_vote }}

上面的兩層屬性查詢是User.has_perm的代理,如果用戶擁有foo.can_vote權限則為True 。

例如:

{% if perms.foo %}

   

You have permission to do something in the foo app.

  com{% if perms.foo.can permp. vote!

   {% endif %}
   {% if perms.foo.can_drive %}

       

You can drive!

   {% endif %}

{% else %}

   

You don't have permission to do anything in the foo app.

{% endif %}



或:

{% if 'foo' in perms %}
 
{% if 'foo' in perms %}
   % if  ' in perms %}
       

In lookup works, too.


   {% endif %}

中文網(www.php.cn)!



陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
怎么将Django项目迁移到linux系统中怎么将Django项目迁移到linux系统中Jun 01, 2023 pm 01:07 PM

Django项目配置修改我们需要把原先的Django项目进行修改才能更好地进行项目迁移工作,首先需要修改的是settings.py文件。由于项目上线之后不能让用户看到后台的运行逻辑,所以我们要把DEBUG改成False,把ALLOWED_HOSTS写成‘*’,这样是为了允许从不同主机进行访问。由于linux中如果不加这句可能会出现文件找不到的情况,所以我们要把模板的路径进行拼接。由于做Django项目肯定进行过数据库的同步,所以我们要把migrations

centos+nginx+uwsgi部署django项目上线的方法centos+nginx+uwsgi部署django项目上线的方法May 15, 2023 am 08:13 AM

我django项目叫yunwei,主要app是rabc和web,整个项目放/opt/下如下:[root@test-codeopt]#lsdjango_virtnginxredisredis-6.2.6yunwei[root@test-codeopt]#lsyunwei/manage.pyrbacstatictemplatesuwsgiwebyunwei[root@test-codeopt]#lsyunwei/uwsgi/cut_log.shloguwsgi.iniuwsgi.loguwsgi.p

Django框架中的数据库迁移技巧Django框架中的数据库迁移技巧Jun 17, 2023 pm 01:10 PM

Django是一个使用Python语言编写的Web开发框架,其提供了许多方便的工具和模块来帮助开发人员快速地搭建网站和应用程序。其中最重要的一个特性就是数据库迁移功能,它可以帮助我们简单地管理数据库模式的变化。在本文中,我们将会介绍一些在Django中使用数据库迁移的技巧,包括如何开始一个新的数据库迁移、如何检测数据库迁移冲突、如何查看历史数据库迁移记录等等

Django框架中的文件上传技巧Django框架中的文件上传技巧Jun 18, 2023 am 08:24 AM

近年来,Web应用程序逐渐流行,而其中许多应用程序都需要文件上传功能。在Django框架中,实现上传文件功能并不困难,但是在实际开发中,我们还需要处理上传的文件,其他操作包括更改文件名、限制文件大小等问题。本文将分享一些Django框架中的文件上传技巧。一、配置文件上传项在Django项目中,要配置文件上传需要在settings.py文件中进

如何用nginx+uwsgi部署自己的django项目如何用nginx+uwsgi部署自己的django项目May 12, 2023 pm 10:10 PM

第一步:换源输入命令换掉Ubuntu的下载源sudonano/etc/apt/sources.list将以下全部替换掉原文件,我这里用的是阿里的源,你也可以换其他的。debhttp://mirrors.aliyun.com/ubuntu/bionicmainrestricteddebhttp://mirrors.aliyun.com/ubuntu/bionic-updatesmainrestricteddebhttp://mirrors.aliyun.com/ubuntu/bionicunive

使用Django构建RESTful API使用Django构建RESTful APIJun 17, 2023 pm 09:29 PM

Django是一个Web框架,可以轻松地构建RESTfulAPI。RESTfulAPI是一种基于Web的架构,可以通过HTTP协议访问。在这篇文章中,我们将介绍如何使用Django来构建RESTfulAPI,包括如何使用DjangoREST框架来简化开发过程。安装Django首先,我们需要在本地安装Django。可以使用pip来安装Django,具体

Django框架中的多数据库支持技巧Django框架中的多数据库支持技巧Jun 18, 2023 am 10:52 AM

Django是一款流行的Pythonweb框架,其出色的ORM(对象关系映射)机制让开发者能够轻松操作数据库。但是在一些实际项目中,需要连接多个数据库,这时候就需要一些技巧来保证项目的稳定性和开发效率。在Django中,多数据库的支持是基于Django框架自身提供的功能而实现的。在这里,我们将介绍一些多数据库支持的技巧,以帮助你在Django的开发中更好地

使用Python Django框架构建博客网站使用Python Django框架构建博客网站Jun 17, 2023 pm 03:37 PM

随着互联网的普及,博客在信息传播和交流方面扮演着越来越重要的角色。在此背景下,越来越多的人开始构建自己的博客网站。本文将介绍如何使用PythonDjango框架来构建自己的博客网站。一、PythonDjango框架简介PythonDjango是一个免费的开源Web框架,可用于快速开发Web应用程序。该框架为开发人员提供了强大的工具,可帮助他们构建功能丰

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器