Django进阶技巧
用户认证和权限
用户认证
用户认证是指确认用户声称的身份是否真实的过程,即验证用户名和密码是否匹配。在Django中,这一过程主要由django.contrib.auth应用处理。
django.contrib.auth是Django框架中的一个核心应用,专门用于处理用户认证和授权相关的功能。这个应用提供了一整套解决方案,包括用户模型、认证视图、权限管理、会话管理等,使得开发者能够方便地实现用户注册、登录、权限控制等功能。下面是对django.contrib.auth几个关键组成部分的详细说明:
- 用户模型(User Model)
Django默认提供了一个用户模型django.contrib.auth.models.User,这个模型包含了一些常用字段,如username、password、email、first_name、last_name等,用于存储用户的基本信息。密码字段经过哈希处理,确保安全性。如果你有更复杂的需求,可以通过继承AbstractUser或AbstractBaseUser来自定义用户模型,像研测平台就是来继承AbstractUser来自定义我们自己的业务员需求。
- 认证视图(Authentication Views)
Django提供了一系列内置的视图函数来处理常见的认证操作,如登录、注销、密码重置、密码更改等。这些视图位于django.contrib.auth.views模块中。例如,LoginView用于处理用户登录逻辑,而LogoutView则负责用户注销。开发者只需在URL配置中引用这些视图即可快速搭建认证流程。
- 认证后端(Authentication Backends)
认证后端决定了如何验证用户的凭证(如用户名和密码)。Django支持多种认证机制,并允许开发者自定义认证后端。默认情况下,Django使用ModelBackend,它基于数据库中的用户模型进行认证。此外,还可以添加其他后端,比如LDAP、OAuth等,以支持不同的认证方式。
通过设置多个认证后端,Django 会依次尝试这些后端来验证用户的登录信息,直到找到一个成功的认证后端或者所有后端都尝试失败。
- 权限和组(Permissions and Groups)
Django提供了一套简单的权限系统,用于控制用户对模型(及其实例)的操作权限。每个模型都有三个默认的权限:“添加”、“修改”、“删除”。此外,可以为模型定义额外的自定义权限。用户可以被直接赋予这些权限,或者通过用户组间接赋予。Group模型允许将权限批量分配给多个用户,便于权限管理。
- 会话管理(Session Management)
Django的会话系统允许服务器跟踪用户的状态。当用户登录后,会创建一个会话,其中可以存储用户信息。会话数据默认保存在数据库中,但也可以配置为保存在cookie或缓存中。会话系统处理登录状态保持、超时及安全性设置,如使用HTTPS-only cookie。
- CSRF保护(CSRF Protection)
跨站请求伪造(CSRF)是一种常见的网络攻击。django.contrib.auth还包含了对跨站请求伪造的防护机制,自动为每个POST请求生成并验证一个CSRF令牌,确保表单提交的安全性。
密码管理(Password Management)
Django提供了密码重置和更改的完整工作流,包括发送密码重置邮件、生成一次性密码链接、验证密码等。这些功能通过视图和表单实现,简化了开发者的实现工作。
综上所述,django.contrib.auth是Django框架安全性和用户管理的核心组件,其设计旨在简化开发者的工作,同时保证应用的安全性。
权限管理
权限管理涉及决定已认证用户能够访问哪些资源或执行哪些操作。Django的权限系统分为基本权限和对象级权限。
- 基本权限(Basic permissions): 每个Django模型都可以定义一组全局权限,比如add_<modelname>, change_<modelname>, delete_<modelname>。这些权限自动添加到auth.permission表,并且可以分配给用户组或单独的用户。
- 对象级权限(Object-level permissions): 除了全局权限,Django也支持对具体对象实例的权限控制。这意味着可以限制用户仅能修改或删除他们自己的某些记录,而不是所有人的记录。这需要手动检查权限,通常在视图函数中完成。
- 组(Groups): Django允许将用户分组,并给组分配权限。这样可以批量管理权限,提高效率。
- 用户权限检查: 使用user.has_perm()方法可以检查用户是否具有某个权限。在模板中也可以使用{% if perms.app_label.codename %}这样的标签来控制内容的显示。
1.2.1在django中实现角色级别的权限控制
在Django中实现角色级别的权限控制,通常涉及创建自定义用户组,并给这些组分配特定的权限,然后将用户分配到对应的组中。以下是实现这一功能的步骤:
- 创建用户组并分配权限
登录Django管理后台,在“用户权限”部分找到“用户组”(Groups),创建新的用户组,比如"管理员"、"编辑"和"普通用户"。
为每个组分配特定的权限。权限可以是预定义的模型权限(在模型的Meta类中定义)或自定义权限。在创建或编辑组时,可以找到权限分配的部分,选择适用于该角色的权限。
- 用户与组关联
在添加或编辑用户时,将用户分配到一个或多个组中。这样,用户就继承了所属组的所有权限。
- 视图函数中的权限检查
在视图中,除了直接检查用户的个人权限外,还可以检查当前用户所属的组是否具有执行某项操作的权限。这可以通过遍历用户所属的组并检查组的权限来实现。
示例代码
假设有一个视图需要管理员权限才能访问,可以这样做:
- 自定义权限检查装饰器
如果你频繁地使用某个特定的角色检查,可以创建自定义的装饰器来简化代码:
1.3.1 在django中实现对象级别的权限控制
在django中要实现对象级别的权限控制,推荐使用第三方库:django-guardian:
- 安装django-guardian:
- 然后,在你的settings.py文件中将其添加到INSTALLED_APPS列表中:
- 并确保配置AUTHENTICATION_BACKENDS:
- 配置模型
确保你的模型中已经定义了权限相关的元数据,尽管这不是必需的,但有助于理解权限的上下文。例如:
- 分配对象权限
你可以使用assign_perm函数给特定的用户或用户组分配对象级别的权限:
- 检查对象权限
在视图中,你可以使用get_perms或has_perm来检查用户是否有特定的对象权限:
这样,你就可以在Django项目中灵活地实施对象级别的权限控制了。通过django-guardian,你可以精细地管理用户对各个模型实例的操作权限,增强应用的安全性和用户体验。
RestFul API
RESTful API 是一种广泛采用的网络 API 设计指南,它利用了 REST(表述性状态转移)架构风格。RESTful API 通过使用标准的 HTTP 方法来处理数据的 CRUD(创建、读取、更新、删除)操作,使得网络服务的开发和消费变得更加简单和高效。
需要注意的是,RESTful API是一种接口风格,并不是代码框架,目的是统一网络接口的编写规范
RESTful API 的核心概念
2.1.1 资源(Resources)
在 RESTful 架构中,一切都被视为资源。资源可以是文档、图片、视频,或者是任何可以命名的事物。每个资源都对应一个唯一的 URL。
2.1.2 统一接口(Uniform Interface)
RESTful API 设计强调使用统一的接口进行资源的操作。这意味着所有的资源都通过相似的接口进行访问,使得用户可以无需了解底层实现,只需通过标准的 HTTP 方法对资源进行操作。
2.1.3 无状态(Stateless)
RESTful API 应该是无状态的,这意味着每次请求都包含了完成请求所需的所有信息,服务器不会在请求之间保存任何状态信息。
2.1.4 可缓存(Cacheable)
响应应该被设计为可缓存的,这可以提高性能并减少服务器的负载。
2.1.5 分层系统(Layered System)
在 RESTful 架构中,客户端通常不知道它是直接与终端服务器通信,还是通过一个或多个中间层。分层允许你插入缓存、负载均衡器等组件。
设计原则
2.2.1 使用标准 HTTP 方法
- GET:用于检索资源。
- POST:用于创建新的资源或触发资源上的处理。
- PUT:用于更新资源或创建新资源。
- DELETE:用于删除资源。
2.2.2 资源命名
使用名词而不是动词来命名资源,并且保持命名直观和易于理解。
2.2.3 分层系统
设计 API 时,应该考虑系统的分层,使得每个层次都可以独立地扩展和替换。
2.2.4 按需加载代码
这是一种可选原则,允许服务器发送执行代码(例如 JavaScript)到客户端,以扩展客户端的功能。
2.2.5 HATEOAS
通过超媒体链接动态提供客户端当前状态下的下一步操作,减少客户端与服务器之间的耦合。
常见中间件
什么是中间件
Django 中间件是一个轻量级的、底层级的 “插件” 系统,用于在 Django 的请求 / 响应处理过程中插入某些特定的逻辑。中间件组件是 Django 框架的核心特性之一,允许开发者在全局层面上修改进入和离开 Django 应用的请求和响应。
中间件的关键点
以下是 Django 中间件的一些关键点:
3.2.1 作用时机
中间件在请求从用户发送到 Django 然后返回响应的整个周期中的多个点被调用。这包括在 Django 处理请求之前、处理请求时、以及生成响应之后。
3.2.2 功能
中间件可以用于多种多样的任务,比如:
- 用户认证和授权
- 会话管理
- CSRF 保护
- 压缩响应内容
- 缓存机制
- 日志记录
- 设置响应头
- 防止点击劫持
- 请求和响应数据的修改
3.2.3 工作原理
中间件以类或函数的形式实现,并且按照在 Django 项目设置文件settings.py中的MIDDLEWARE配置列表的顺序来调用。请求和响应会通过这个中间件列表,在每个中间件中可以执行特定的操作。
3.2.4 方法
一个中间件可以包含以下方法(但不一定要全部实现):
- init(self, get_response): 初始化中间件,接收一个get_response参数,这个参数是一个可调用的对象,用于调用中间件链中的下一个中间件或最终的视图。
- process_request(self, request): 在 Django 决定哪个视图处理请求之前调用。
- process_view(self, request, view_func, view_args, view_kwargs): 在 Django 调用视图函数之前调用。
- process_response(self, request, response): 在视图函数处理完请求后,返回响应之前调用。
- process_exception(self, request, exception): 如果在视图函数中抛出了异常,这个方法会被调用。
DRF 架构
简介
DRF,即 Django REST framework,是一个强大且灵活的工具集,用于构建 Web API 在 Django 项目中。它提供了序列化器、视图、路由器等工具,让开发者能够快速地开发出符合 RESTful 规范的 API。以下是针对新手小白的 DRF 介绍,包括一个简单的代码实例。
DRF 的主要优点:
- 符合 RESTful 设计原则:它鼓励使用无状态的、可缓存的通信协议。
- 高度可扩展:你可以利用它的插件系统来扩展其功能。
- 强大的文档:自动生成 API 文档,便于开发和测试。
4.2 实战例子
4.2.1 安装
首先,确保你已经有一个 Django 项目。以下是安装 DRF 的步骤:
然后在你的settings.py中添加以下内容来注册 DRF:
下面我们将创建一个简单的 API 来管理博客文章。
4.2.2 定义模型
首先,在models.py中定义一个简单的模型:
4.2.3 创建序列化器
在serializers.py中创建一个序列化器:
4.2.4 创建视图
在views.py中创建视图,使用 DRF 的APIView:
4.2.5 配置 URLs
在urls.py中配置 URL:
4.2.6 运行服务器
确保你的数据库表已经被创建:
然后运行开发服务器:
4.2.7 测试 API
现在,你可以使用浏览器或者 Postman 等工具来测试你的 API。
- 获取文章列表:访问 http://127.0.0.1:8000/articles/
- 创建新文章:发送 POST 请求到 http://127.0.0.1:8000/articles/,并在请求体中包含title, author, 和 body字段。
以下是使用curl的一个例子:
获取文章列表
curl http://127.0.0.1:8000/articles/
创建新文章
curl -X POST -H "Content-Type: application/json" -d '{"title": "My Title", "author": "Me", "body": "This is my article body."}' http://127.0.0.1:8000/articles/