Django 内置权限扩展案例详解

yizhihongxing

这里是针对“Django 内置权限扩展案例详解”的完整攻略,包含两个示例说明的详细讲解。

1. 示例一

1.1 案例描述

假设我们要实现一个博客系统,需要实现以下功能:

  1. 所有用户都可以浏览博客列表和单篇博客。
  2. 未登录用户不能对博客进行任何操作(包括新建、修改、删除和点赞)。
  3. 登录用户可以进行以下操作:
  4. 创建自己的博客文章。
  5. 修改自己创建的博客文章。
  6. 删除自己创建的博客文章。
  7. 对任意一篇博客进行点赞。

1.2 解决方案

根据需求,需要对用户进行认证和授权,Django内置的权限系统可以帮助我们实现这些功能。具体实现方式如下:

1. 创建Blog模型

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    created_time = models.DateTimeField(auto_now_add=True)
    modified_time = models.DateTimeField(auto_now=True)
    like_count = models.IntegerField(default=0)

    def __str__(self):
        return self.title

其中,我们通过ForeignKey关联了User模型,确定作者权限。

2. 配置权限

在settings.py中配置权限:

INSTALLED_APPS = [
    ...
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

# 添加权限配置

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

LOGIN_URL = '/login/'

LOGOUT_URL = '/logout/'

LOGIN_REDIRECT_URL = '/'

3. 创建博客的视图函数

首先,我们需要在views.py中实例化Blog表单,渲染模板:

from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from .models import Blog
from .forms import BlogForm

def blog_list(request):
    blogs = Blog.objects.all()
    return render(request, 'blog/blog_list.html', context={'blogs': blogs})

def blog_detail(request, blog_id):
    blog = get_object_or_404(Blog, pk=blog_id)
    return render(request, 'blog/blog_detail.html', context={'blog': blog})

@login_required(login_url='login')
def blog_create(request):
    if request.method == 'GET':
        form = BlogForm()
    else:
        form = BlogForm(request.POST)
        if form.is_valid():
            blog = form.save(commit=False)
            blog.author = request.user
            blog.save()
            return redirect('blog_detail', blog_id=blog.id)
    return render(request, 'blog/blog_create.html', context={'form': form})

@login_required(login_url='login')
def blog_update(request, blog_id):
    blog = get_object_or_404(Blog, pk=blog_id, author=request.user)
    if request.method == 'GET':
        form = BlogForm(instance=blog)
    else:
        form = BlogForm(request.POST, instance=blog)
        if form.is_valid():
            form.save()
            return redirect('blog_detail', blog_id=blog.id)
    return render(request, 'blog/blog_update.html', context={'form': form})

@login_required(login_url='login')
def blog_delete(request, blog_id):
    blog = get_object_or_404(Blog, pk=blog_id, author=request.user)
    blog.delete()
    return redirect('blog_list')

@login_required(login_url='login')
def blog_like(request, blog_id):
    blog = get_object_or_404(Blog, pk=blog_id)
    blog.like_count += 1
    blog.save()
    return redirect('blog_detail', blog_id=blog_id)

有几点需要注意:

  1. 使用的是Django内置的@login_required装饰器来限制用户访问需要登录的页面。
  2. 在blog_create视图函数中,我们使用form.save(commit=False)来创建一条未保存的博客对象,随后将博客的作者设置为request.user,并调用blog.save()来保存对象。
  3. 在blog_update和blog_delete视图函数中,我们使用get_object_or_404来判断用户是否有权限,同时需要通过pk和作者进行精确定位。
  4. 在blog_like视图函数中增加了博客点赞的功能。

4. 创建博客的表单

针对Blog表,我们编写Blog表单:

from django import forms
from .models import Blog

class BlogForm(forms.ModelForm):
    class Meta:
        model = Blog
        fields = ['title', 'content']

5. 实现前端模板

在templates文件夹中的博客列表页blog_list.html:

{% extends 'base.html' %}

{% block content %}
    <h2>Blog List</h2>
    {% for blog in blogs %}
        <p>
            <a href="{% url 'blog_detail' blog.id %}">
                {{blog.title}}
            </a>
            <br>
            <small>
                Written by {{blog.author.username}} on {{blog.created_time}}
            </small>
            {% if request.user.username == blog.author.username %}
                <br>
                <a href="{% url 'blog_update' blog.id %}">Edit</a>
                <a href="{% url 'blog_delete' blog.id %}">Delete</a>
            {% endif %}
        </p>
    {% endfor %}
{% endblock %}

在templates文件夹中的博客详情页blog_detail.html:

{% extends 'base.html' %}

{% block content %}
    <h2>{{blog.title}}</h2>
    <p>{{blog.content}}</p>
    <small>Written by {{blog.author.username}} on {{blog.created_time}}</small>
    <br>
    {% if request.user.username == blog.author.username %}
        <a href="{% url 'blog_update' blog.id %}">Edit</a>
        <a href="{% url 'blog_delete' blog.id %}">Delete</a>
    {% endif %}
    <br>
    <form method="post" action="{% url 'blog_like' blog.id %}">
        {% csrf_token %}
        <button>Like ({{blog.like_count}})</button>
    </form>
{% endblock %}

在templates文件夹中的博客创建页blog_create.html:

{% extends 'base.html' %}

{% block content %}
    <h2>New Blog</h2>
    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Create</button>
    </form>
{% endblock %}

在templates文件夹中的博客更新页blog_update.html:

{% extends 'base.html' %}

{% block content %}
    <h2>Edit Blog</h2>
    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Update</button>
    </form>
{% endblock %}

此外,还需要创建base.html和login.html两个模版。

现在我们已经完成了第一个示例的代码实现,下面来看一下如何使用权限管理来实现第二个示例。

2. 示例二

2.1 案例描述

假如我们需要实现一个聊天室应用,具有以下几个要求:

  1. 所有用户都可以浏览当前聊天记录。
  2. 未登录用户不能发言。
  3. 登录用户可以自由发言,但是不能修改和删除其他人的聊天记录。

2.2 解决方案

根据需求,需要对用户进行认证和授权,Django内置的权限系统可以帮助我们实现这些功能。具体实现方式如下:

1. 创建Chat模型

from django.db import models
from django.contrib.auth.models import User

class Chat(models.Model):
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.content

为了实现针对聊天记录的鉴权,我们使用了ForeignKey关联了User模型,确定作者权限。

2. 配置权限

和第一个示例类似,在settings.py中配置权限:

INSTALLED_APPS = [
    ...
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

# 添加权限配置

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

LOGIN_URL = '/login/'

LOGOUT_URL = '/logout/'

LOGIN_REDIRECT_URL = '/'

3. 进行聊天的视图函数

在views.py中实现以下视图函数:

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import Chat

def chat_list(request):
    chats = Chat.objects.all()
    return render(request, 'chat/chat_list.html', context={'chats': chats})

@login_required(login_url='login')
def chat_create(request):
    if request.method == 'GET':
        context = {}
    else:
        content = request.POST.get('content')
        author = request.user
        Chat.objects.create(content=content, author=author)
        return redirect('chat_list')
    return render(request, 'chat/chat_create.html', context=context)

@login_required(login_url='login')
def chat_update(request, chat_id):
    chat = Chat.objects.get(pk=chat_id)

    if request.method == 'GET':
        context = {'content': chat.content}
    else:
        chat.content = request.POST.get('content')
        chat.save()
        return redirect('chat_list')

    return render(request, 'chat/chat_update.html', context=context)

@login_required(login_url='login')
def chat_delete(request, chat_id):
    Chat.objects.filter(pk=chat_id, author=request.user).delete()
    return redirect('chat_list')

其中,使用@login_required装饰器来限制用户访问需要登录的页面。在chat_create、chat_update和chat_delete视图函数中,使用了filter确保用户只能编辑自己的聊天记录。

4. 实现前端模板

在templates文件夹中的聊天记录列表页chat_list.html:

{% extends 'base.html' %}

{% block content %}
    <h2>Chat List</h2>
    <ul>
    {% for chat in chats %}
        <li>
            {{chat.content}}
            <small>
                Written by {{chat.author.username}} on {{chat.created_time}}
            </small>
            {% if request.user.username == chat.author.username %}
                <br>
                <a href="{% url 'chat_update' chat.id %}">Edit</a>
                <a href="{% url 'chat_delete' chat.id %}">Delete</a>
            {% endif %}
        </li>
    {% endfor %}
    </ul>
{% endblock %}

在templates文件夹中的聊天记录创建页chat_create.html:

{% extends 'base.html' %}

{% block content %}
    <h2>New Chat</h2>
    <form method="POST">
        {% csrf_token %}
        <label>Content:</label><br>
        <textarea name="content"></textarea>
        <br>
        <button type="submit">Submit</button>
    </form>
{% endblock %}

在templates文件夹中的聊天记录编辑页chat_update.html:

{% extends 'base.html' %}

{% block content %}
    <h2>Edit Chat</h2>
    <form method="POST">
        {% csrf_token %}
        <label>Content:</label><br>
        <textarea name="content">{{content}}</textarea>
        <br>
        <button type="submit">Submit</button>
    </form>
{% endblock %}

在templates文件夹中还需要创建一个base.html模版,作为模版继承的基础模版。值得注意的是,聊天列表页中,只有当request.user.username与chat.author.username相同时,才会出现编辑和删除按钮。

以上就是针对“Django 内置权限扩展案例详解”的完整攻略,希望能够对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django 内置权限扩展案例详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询 】

    下面我将详细讲解关于Django框架中使用views.py的函数对表进行增删改查内容操作的攻略。 1. models.py中表的创建 首先,在使用views.py中的函数对表进行操作之前,需要先在models.py中创建相应的数据库表。在Django框架中,创建表需要使用到models模块。具体步骤如下: 打开项目目录中的models.py文件,导入必要的模…

    Django 2023年5月16日
    00
  • Django源码分析之执行入口

    魔法门 一般我们启动django,最简单的方法是进入project 目录,这时目录结构是这样的 然后我们执行python manage.py runserver,程序就开始执行了。 那django是如何从一个命令就启动整个server,启动的流程是如何的? 踏门而入 打开目录下的manage.py,内容是这样的: #!/usr/bin/env python …

    Django 2023年4月11日
    00
  • python+django+虚拟环境(virtualenv[wrapper])+nginx+uwsgi在linux中的安装配置

    编译安装python3 安装依赖 sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev  sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqli…

    Django 2023年4月13日
    00
  • django admin 添加用户出现外键约束错误

    今天在做mxonline项目时,注册了用户表进admin后,想在后台添加一个用户试试,结果出现了错误,经过一番搜索发现以下两个解决方法,不过我只用了一种 报错信息: IntegrityError: (1452, u’Cannot add or update a child row: a foreign key constraint fails (`mxonl…

    Django 2023年4月11日
    00
  • django向数据库添加数据

    url.py        views.py    host.html (样式)  (展示部分)   (添加信息界面) (js部分)     展示添加数据:    

    Django 2023年4月12日
    00
  • Django 多环境配置详解

    下面我来详细讲解“Django 多环境配置详解”的完整攻略。 什么是多环境配置? 在开发一个 Django 网站的过程中,我们需要在本地环境、测试环境和生产环境等不同的环境下进行部署。而不同的环境可能需要不同的配置,比如数据库设置、缓存设置等等。因此,我们需要对不同的环境进行不同的配置,这就是多环境配置。 多环境配置步骤 实现 Django 的多环境配置可以…

    Django 2023年5月16日
    00
  • Django序列化和反序列化

    1)在开发REST接口时,视图中做的最主要的三件事   将请求的数据(如:Json格式)转换为模型类对象(反序列化)  操作数据库  将模型类对象转换为响应的数据(如:Json格式)(序列化)(2)序列化   1)概念     将程序中的一个数据结构类型转化为其它格式(字典、json、XML等)。例如:将django中的模型类对象转换为json字符串,这个转…

    Django 2023年4月12日
    00
  • django _meta方法

    1 models.Book._meta.’concrete_model’: <class ‘books.models.Book’> 2 models.Book._meta.’related_fkey_lookups’: [] 3 models.Book._meta.’get_latest_by’: None 4 models.Book._meta…

    Django 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部