前端Python应用指南(六)构建RESTful API:使用Flask和Django实现用户认证与授权

《写给前端的python应用指南》系列:

  • (一)快速构建 Web 服务器 - Flask vs Node.js 对比
  • (二)深入Flask:理解Flask的应用结构与模块化设计
  • (三)Django vs Flask:哪种框架适合构建你的下一个Web应用?
  • (四)Django实战:创建一个简单的博客系统
  • (五)用FastAPI快速构建高性能API

在构建现代Web应用时,用户认证与授权是非常重要的部分。无论是通过用户名和密码登录,还是通过OAuth2、JWT等方式进行身份验证,确保只有授权的用户可以访问敏感数据是每个API设计的核心。本篇博文将详细介绍如何使用FlaskDjango构建RESTful API,并实现用户认证与授权功能,包括JWT(JSON Web Tokens)的使用。

一、概述

RESTful API通常用于前后端分离的应用,用户认证与授权机制用于保护API,使得只有经过认证的用户才能访问特定的资源。JWT(JSON Web Token)作为一种轻量级的认证方式,广泛应用于前后端分离的Web应用中。

在本文中,我们将分别使用FlaskDjango实现:

  • 用户注册
  • 用户登录(并生成JWT)
  • 保护需要授权的API(通过JWT)

二、Flask实现用户认证与授权

Flask是一个轻量级Web框架,非常适合用来快速构建RESTful API。我们将通过Flask和Flask-JWT-Extended扩展来实现JWT认证。

2.1 安装依赖

首先,我们需要安装Flask和Flask-JWT-Extended。

pip install flask flask-jwt-extended flask-sqlalchemy
2.2 创建Flask应用

我们将创建一个简单的Flask应用,包含用户注册、登录和JWT认证的功能。

  1. 初始化Flask应用:
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identityapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'  # 使用SQLite数据库
app.config['JWT_SECRET_KEY'] = 'your_jwt_secret_key'  # JWT的密钥db = SQLAlchemy(app)
jwt = JWTManager(app)
  1. 创建用户模型:

我们将创建一个用户模型,用户将具有usernamepassword字段。

class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)password = db.Column(db.String(120), nullable=False)def __repr__(self):return f'<User {self.username}>'
  1. 用户注册:

用户注册时,我们将验证输入,并将密码进行哈希处理后存入数据库。

from werkzeug.security import generate_password_hash@app.route('/register', methods=['POST'])
def register():data = request.get_json()username = data.get('username')password = data.get('password')# 检查用户是否已存在if User.query.filter_by(username=username).first():return jsonify({"msg": "User already exists"}), 400# 哈希处理密码hashed_password = generate_password_hash(password, method='sha256')new_user = User(username=username, password=hashed_password)db.session.add(new_user)db.session.commit()return jsonify({"msg": "User created successfully"}), 201
  1. 用户登录并生成JWT:

用户登录时,我们验证用户名和密码是否匹配,若匹配则返回一个JWT。

from werkzeug.security import check_password_hash@app.route('/login', methods=['POST'])
def login():data = request.get_json()username = data.get('username')password = data.get('password')user = User.query.filter_by(username=username).first()if user and check_password_hash(user.password, password):access_token = create_access_token(identity=username)return jsonify(access_token=access_token), 200else:return jsonify({"msg": "Invalid credentials"}), 401
  1. 受保护的API:

我们使用@jwt_required()装饰器来保护需要授权的API。用户必须在请求头中提供有效的JWT才能访问这些API。

@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():current_user = get_jwt_identity()  # 获取当前用户的身份信息return jsonify(logged_in_as=current_user), 200
  1. 运行Flask应用:
if __name__ == '__main__':db.create_all()  # 创建数据库表app.run(debug=True)
2.3 测试Flask API

你可以使用Postman或者curl工具来测试这些API接口:

  • 注册用户POST /register

    • 请求体:{"username": "john", "password": "password123"}
    • 响应:{"msg": "User created successfully"}
  • 用户登录POST /login

    • 请求体:{"username": "john", "password": "password123"}
    • 响应:{"access_token": "jwt_token_here"}
  • 访问受保护的APIGET /protected

    • 请求头:Authorization: Bearer <jwt_token_here>
    • 响应:{"logged_in_as": "john"}

三、Django实现用户认证与授权

Django是一个功能强大的Web框架,适用于构建复杂的Web应用。在Django中实现JWT认证,我们通常会使用djangorestframeworkdjangorestframework-simplejwt这两个库来进行集成。

3.1 安装依赖

首先,我们需要安装Django、Django REST framework以及JWT相关库。

pip install django djangorestframework djangorestframework-simplejwt
3.2 创建Django项目和应用
django-admin startproject myproject
cd myproject
python manage.py startapp accounts
3.3 配置Django项目

myproject/settings.py中,添加rest_frameworkaccountsINSTALLED_APPS

INSTALLED_APPS = [...'rest_framework','accounts',
]

然后,配置JWT设置:

REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_simplejwt.authentication.JWTAuthentication',],
}
3.4 创建用户模型和序列化器

我们将在accounts/models.py中创建用户模型,并在accounts/serializers.py中创建序列化器。

  1. 创建用户模型:

accounts/models.py文件中,我们可以使用Django的默认用户模型或者自定义一个用户模型:

from django.contrib.auth.models import AbstractUserclass User(AbstractUser):pass
  1. 创建序列化器:

accounts/serializers.py文件中,我们为用户注册和登录创建序列化器:

from rest_framework import serializers
from django.contrib.auth.models import Userclass UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ['username', 'password']def create(self, validated_data):user = User.objects.create_user(**validated_data)return user
3.5 创建视图和URL路由

accounts/views.py中,我们使用APIView来处理注册、登录以及JWT认证。

  1. 用户注册视图:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializers import UserSerializerclass RegisterView(APIView):def post(self, request):serializer = UserSerializer(data=request.data)if serializer.is_valid():serializer.save()return Response({"msg": "User created successfully"}, status=status.HTTP_201_CREATED)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  1. 用户登录视图(获取JWT):
from rest_framework_simplejwt.tokens import RefreshTokenclass LoginView(APIView):def post(self, request):username = request.data.get("username")password = request.data.get("password")user = authenticate(username=username, password=password)if user:refresh = RefreshToken.for_user(user)access_token = str(refresh.access_token)return Response({"access_token": access_token}, status=status.HTTP_200_OK)return Response({"msg": "Invalid credentials"}, status=status.HTTP_401_UNAUTHORIZED)
  1. 受保护的视图:
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIViewclass ProtectedView(APIView):permission_classes = [IsAuthenticated]def get(self, request):return Response({"msg": "You have access to this protected view."}, status=status.HTTP_200_OK)
3.6 配置URL路由

accounts/urls.py中,配置相应的路由:

from django.urls import path
from .views import RegisterView, LoginView, ProtectedViewurlpatterns = [path('register/', RegisterView.as_view(), name='register'),path('login/', LoginView.as_view(), name='login'),path('protected/', ProtectedView.as_view(), name='protected'),
]

myproject/urls.py中,包含accounts/urls.py

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('api/accounts/', include('accounts.urls')),
]
3.7 运行Django项目
python manage.py runserver
3.8 测试Django API

使用Postman或curl测试以下API:

  • 注册用户POST /api/accounts/register/
  • 用户登录POST /api/accounts/login/
  • 访问受保护的APIGET /api/accounts/protected/(需要JWT令牌)

四、总结

通过本文的示例,我们分别展示了如何使用FlaskDjango实现用户认证与授权,保护RESTful API。两种框架都支持JWT认证,但在实现上有所不同:

  • Flask适合轻量级项目,灵活且简洁。
  • Django则更适合复杂的应用,具有更强的功能和更好的扩展性。

无论你选择Flask还是Django,它们都能提供高效、安全的认证方式,并能帮助你快速构建可扩展的RESTful API。希望本文的示例能帮助你在实际项目中更好地实现用户认证与授权功能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASO优化之增加应用程序评论行之有效的成功战略

应用评论不仅对于用户信任至关重要&#xff0c;而且对于提高应用可见度、转化率以及整体应用商店优化&#xff08;ASO&#xff09;也至关重要。评论和评分会影响App Store和Google Play平台上算法的排名,这些平台优先考虑具有更高参与度和满意度指标的应用程序。下面,我们将概述…

字符串存储、分割相关总结(strncpy 函数和strtok() 函数相关)

1.想用这些函数都需要导入头文件 #include<string.h> 2.怎么创建字符串并输入 #define maxsize 100 char a[maxsize1];//创建字符串&#xff0c;预留一个位置放\0 【1】scanf("%s",a);//使用 scanf 函数读取不带空格的字符串 【2】fgets(a, sizeof(a), stdi…

【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.4.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例&#xff1a; m…

快速排序学习优化

首先&#xff0c;上图。 ‘’’ cpp int partSort(int *a ,int left,int right) {int keyi left; //做左侧基准while(left<right){while(left<right && a[right]>a[keyi]){right--;}while(left<right && a[left]<a[keyi]){left;}swap(a[left…

宏集eX710物联网工控屏在石油开采机械中的应用与优势

案例概况 客户&#xff1a;天津某石油机械公司 应用产品&#xff1a;宏集eX710物联网工控屏 应用场景&#xff1a;钻井平台设备控制系统 一、应用背景 石油开采和生产过程复杂&#xff0c;涵盖钻井平台、采油设备、压缩机、分离器、管道输送系统等多种机械设备。这些设备通…

【MySQL】第一弹----库的操作及数据类型

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;MySQL &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 一、SQL 语句分类 DDL:数据定…

阿里云-将旧服务器数据与配置完全迁移至新服务器

文章目录 一&#xff1a;创建镜像二&#xff1a;将创建好的镜像复制到新服务器所在的目标地域&#xff08;如果新服务器与镜像在同一地域就不用进行这一操作&#xff09;三&#xff1a;将镜像配置到新服务器上四&#xff1a;导出安全组&#xff08;如果新服务器与旧服务器使用同…

vue3使用element-plus,解决 el-table 多选框,选中后翻页再回来选中失效问题

问题&#xff1a;勾选的数据分页再回来回消失 1.在el-table中加 :row-key"getRowKey" const getRowKey (row) > { return row.id; // id必须是唯一的 }; 2.给type为selection的el-table-column添加上reserve-selection属性 <el-tableref"multipleTab…

StableAnimator模型的部署:复旦微软提出可实现高质量和高保真的ID一致性人类视频生成

文章目录 一、项目介绍二、项目部署模型的权重下载提取目标图像的关节点图像&#xff08;这个可以先不看先用官方提供的数据集进行生成&#xff09;提取人脸&#xff08;这个也可以先不看&#xff09;进行图片的生成 三、模型部署报错 一、项目介绍 由复旦、微软、虎牙、CMU的…

JS中的闭包和上下文

变量提升 和 函数提升 这里要提到一个提升的概念&#xff0c;即在JS中&#xff0c;在解析代码之前还有一个预处理的过程&#xff0c;这个过程中会把部分变量和函数声明提前到代码的最顶部&#xff0c; 会在其他所有代码之前执行。虽然当我们按照规范&#xff08;严格模式或者T…

从百度云网盘下载数据到矩池云网盘或者服务器内

本教程教大家如何快速将百度云网盘数据集或者模型代码文件下载到矩池云网盘或者服务器硬盘上。 本教程使用到了一个开源工具 BaiduPCS-Go&#xff0c;官方地址 &#xff1a; https://github.com/qjfoidnh/BaiduPCS-Go 这个工具可以实现“仿 Linux shell 文件处理命令的百度网…

【每日学点鸿蒙知识】hvigor升级、Dialog动画、LocalStorage无效、页面与子组件的生命周期、cookie设置

1、HarmonyOS 编译工具hvigor如何升级到"hvigorVersion": "4.2.0"版本&#xff1f; 可以手动更新到指定版本&#xff0c;参考链接如下&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-hvigor-plugin-V5 2、HarmonyOS…

【AI学习】DeepSeek-V3 技术报告学习:总体架构

翻了一下DeepSeek-V3 技术报告学习&#xff0c;太长&#xff0c;只是大概翻了一下&#xff0c;其中Multi-Token Prediction的技术就很亮眼。 摘要 本文介绍了DeepSeek-V3&#xff0c;这是一个拥有671B总参数的强大混合专家&#xff08;MoE&#xff09;语言模型&#xff0c;每…

C语言-数据结构-图

目录 一,图的概念 1,图的定义 2,图的基本术语 二,图的存储结构 1,邻接矩阵 2,邻接表 三,图的遍历 1,深度优先搜索 2,广度优先搜素 四,生成树和最小生成树 1,生成树的特点: 2,最小生成树 (1)普利姆算法Prim (2)普里姆算法思路 五,最短路径 1,Dijkstra算法 2,Fl…

C语言-数据结构-查找

目录 一,查找的概念 二,线性查找 1,顺序查找 2,折半查找 3,分块查找 三,树表的查找 1,二叉排序树 (1)查找方式: (2)、二叉排序树的插入和生成 (3)、二叉排序树的删除 2,平衡二叉树 (1)、什么是平衡二叉树 (2)、平衡二叉树的插入调整 &#xff08;1&#xff09;L…

【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训

升级版1-清空全部的再次确认 实现功能: 历史搜索记录展示-历史搜索记录展示10条点击跳转-点击历史搜索记录可同步到搜索框并自动搜索全部删除-可一次性全部删除历史搜索记录全部删除-有再次确认操作展示 进行搜索后留下搜索记录 点击垃圾桶图标,显示【清空全部】 点击【清…

macrodroid通过http请求控制手机运行宏

macrodroid adb命令 adb shell pm grant com.arlosoft.macrodroid android.permission.WRITE_SECURE_SETTINGS例:http请求手机播放指定MP3文件 声音素材_电量过低提醒 新建一个宏 添加触发器-连接-http服务器请求 路径随意填,最好不要有特殊符号,不然浏览器识别链接会出错,…

【CSS in Depth 2 精译_098】17.3:CSS 动画延迟技术与填充模式设置 + 17.4:通过 CSS 动画传递意图的秘诀

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 17 章 动画】 ✔️ 17.1 关键帧17.2 3D 变换下的动画设置 17.2.1 添加动画前页面布局的构建17.2.2 为布局添加动画 17.3 动画延迟与填充模式 ✔️17.4 通过动画传递意图…

慧集通客户案例:致远OA与熵基考勤机集成方案

本原型公司是一家专注大健康产业的综合性高新科技形实体企业&#xff0c;按照单位的战略业务布局&#xff0c;围绕“做强做优、世界一流”的目标&#xff0c;加快内外部资源整合、加强业务协同、优化资源配置&#xff0c;有序推进大健康及相关产业的有机融合&#xff0c;加快构…

深度学习笔记(6)——循环神经网络RNN

循环神经网络 RNN 核心思想:RNN内部有一个“内部状态”,随着序列处理而更新 h t f W ( h t − 1 , x t ) h_tf_W(h_{t-1},x_t) ht​fW​(ht−1​,xt​) h t h_t ht​是new state, h t − 1 h_{t-1} ht−1​是old state, x t x_t xt​是当前时间步的输入,所有时间步共享 f W…