Flutter Django认证扩展插件pbp_django_auth_extended的使用
Flutter Django认证扩展插件pbp_django_auth_extended的使用
pbp_django_auth_extended
这是一个从pbp_django_auth
派生的Flutter包。它帮助学生在Flutter应用程序中实现来自Django Web服务的身份验证。此派生(扩展)包添加了pbp_django_auth
包中不存在的功能。
获取开始
Django的部分
要使用该包,你需要在你的Django项目中创建一个异步JavaScript(AJAX)登录视图。
-
运行
python manage.py startapp authentication
创建一个新的应用模块来处理AJAX登录。 -
在
settings.py
中添加"authentication"
到INSTALLED_APPS
。 -
运行
pip install django-cors-headers
安装所需的库。 -
在
settings.py
中添加"corsheaders"
到INSTALLED_APPS
。 -
在
settings.py
中添加"corsheaders.middleware.CorsMiddleware"
到MIDDLEWARE
。 -
在
settings.py
中创建一个新的变量CORS_ALLOW_ALL_ORIGINS
并设置其值为True
(CORS_ALLOW_ALL_ORIGINS=True
)。 -
在
settings.py
中创建一个新的变量CORS_ALLOW_CREDENTIALS
并设置其值为True
(CORS_ALLOW_CREDENTIALS=True
)。 -
在
settings.py
中创建以下变量:CSRF_COOKIE_SECURE = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SAMESITE = 'None' SESSION_COOKIE_SAMESITE = 'None'
-
在
authentication/views.py
中创建一个登录视图方法。 示例登录视图from django.shortcuts import render from django.contrib.auth import authenticate, login as auth_login from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt [@csrf_exempt](/user/csrf_exempt) def login(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: if user.is_active: auth_login(request, user) # 跳转到成功页面 return JsonResponse({ "status": True, "message": "成功登录!" # 如果你想传递数据到Flutter,可以在这里插入额外的数据 }, status=200) else: return JsonResponse({ "status": False, "message": "登录失败,账户已禁用。" }, status=401) else: return JsonResponse({ "status": False, "message": "登录失败,请检查您的用户名/密码。" }, status=401)
此视图将为用户设置cookie,并允许带有
@login_required
装饰器的认证请求。 -
在
authentication/views.py
中创建一个检查是否匿名的视图方法。def check_is_anonymous(request): print(request.user.is_anonymous) return JsonResponse({ "anonymous": request.user.is_anonymous }, status=200)
-
在
authentication/urls.py
中添加URL。path('is-anonymous/', check_is_anonymous, name='check_is_anonymous'),
Flutter的部分
要使用该包,修改应用程序根部件,通过使用Provider
向所有子部件提供CookieRequest
库。
例如,如果以前的应用初始化代码如下:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter App'),
routes: {
"/login": (BuildContext context) => const LoginPage(),
},
);
}
}
将其更改为:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Provider(
create: (_) {
CookieRequest request = CookieRequest(baseUrl: '<DJANGO BASE URL>'); // 不要在此处使用尾随'/'
return request;
},
child: MaterialApp(
title: 'Flutter App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter App'),
routes: {
"/login": (BuildContext context) => const LoginPage(),
},
),
);
}
}
这将创建一个新的Provider
对象,将CookieRequest
实例与应用程序中的所有组件共享。
使用方法
要将该包用于您的项目,请遵循以下步骤。
- 导入
Provider
库和该包到组件。import 'package:provider/provider.dart'; import 'package:pbp_django_auth/pbp_django_auth.dart'; ...
- 在Widget的
build(BuildContext context)
函数中调用context.watch
实例化request
对象。 示例class _LoginPageState extends State<LoginPage> { final _loginFormKey = GlobalKey<FormState>(); bool isPasswordVisible = false; void togglePasswordView() { setState(() { isPasswordVisible = !isPasswordVisible; }); } String username = ""; String password1 = ""; @override Widget build(BuildContext context) { final request = context.watch<CookieRequest>(); // 下面是其余的widget代码 ... } }
- 使用包进行登录时,调用
request.login(url, data)
方法。// 'username' 和 'password' 应该是用户登录表单的值。 final response = await request.login("/auth/login", { 'username': username, 'password': password1, }); if (request.loggedIn) { // 登录成功的代码将运行此处。 } else { // 登录失败(错误的用户名/密码)的代码将运行此处。 }
- 使用库获取或插入数据时,调用
request.get(url)
或request.post(url, data)
方法。/* GET 请求示例: */ final response = await request.get('<PATH TO ACCESS (DO NOT INCLUDE BASE URL)>'); // 返回的响应将是一个包含JsonResponse键的Map对象 /* POST 请求示例: */ final response = await request.post('<PATH TO ACCESS (DO NOT INCLUDE BASE URL)>', { "data1": "这是示例数据", "data2": "这是示例数据2", }); // data 参数应为Django表单的键。 // 返回的响应将是一个包含JsonResponse键的Map对象。
更多关于Flutter Django认证扩展插件pbp_django_auth_extended的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Django认证扩展插件pbp_django_auth_extended的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
pbp_django_auth_extended
是一个 Flutter 插件,用于在 Flutter 应用中与 Django 后端进行用户认证。它简化了与 Django 后端的用户认证过程,包括登录、注册、密码重置等操作。
以下是如何在 Flutter 项目中使用 pbp_django_auth_extended
插件的基本步骤:
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 pbp_django_auth_extended
依赖:
dependencies:
flutter:
sdk: flutter
pbp_django_auth_extended: ^1.0.0 # 请确保使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 初始化插件
在你的 main.dart
文件中初始化 pbp_django_auth_extended
插件:
import 'package:pbp_django_auth_extended/pbp_django_auth_extended.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Django Auth',
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Django Auth'),
),
body: AuthWrapper(),
),
);
}
}
3. 实现认证逻辑
在 AuthWrapper
组件中,你可以实现登录、注册等认证逻辑。以下是一个简单的登录示例:
import 'package:flutter/material.dart';
import 'package:pbp_django_auth_extended/pbp_django_auth_extended.dart';
class AuthWrapper extends StatefulWidget {
@override
_AuthWrapperState createState() => _AuthWrapperState();
}
class _AuthWrapperState extends State<AuthWrapper> {
final _formKey = GlobalKey<FormState>();
final _usernameController = TextEditingController();
final _passwordController = TextEditingController();
Future<void> _login() async {
final auth = DjangoAuthExtended(
baseUrl: 'https://your-django-backend.com/api', // 你的 Django 后端 API 地址
);
try {
final response = await auth.login(
username: _usernameController.text,
password: _passwordController.text,
);
if (response['success']) {
// 登录成功
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('登录成功')),
);
} else {
// 登录失败
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('登录失败: ${response['message']}')),
);
}
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('登录出错: $e')),
);
}
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
children: [
TextFormField(
controller: _usernameController,
decoration: InputDecoration(labelText: '用户名'),
),
TextFormField(
controller: _passwordController,
decoration: InputDecoration(labelText: '密码'),
obscureText: true,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _login,
child: Text('登录'),
),
],
),
),
);
}
}
4. Django 后端配置
确保你的 Django 后端支持用户认证,并且已经设置了相应的 API 端点。通常,这些端点包括:
/api/login/
- 处理用户登录/api/register/
- 处理用户注册/api/logout/
- 处理用户注销/api/password/reset/
- 处理密码重置
你可以使用 Django REST Framework 或 Django AllAuth 等库来实现这些功能。
5. 处理用户认证状态
pbp_django_auth_extended
还可以帮助你管理用户的认证状态。你可以使用 DjangoAuthExtended
提供的方法来检查用户是否已经登录,并获取用户信息。
Future<void> _checkLoginStatus() async {
final auth = DjangoAuthExtended(
baseUrl: 'https://your-django-backend.com/api',
);
final isLoggedIn = await auth.isLoggedIn();
if (isLoggedIn) {
final userInfo = await auth.getUserInfo();
print('用户已登录: ${userInfo['username']}');
} else {
print('用户未登录');
}
}
6. 注销用户
你可以使用 logout
方法来注销当前用户:
Future<void> _logout() async {
final auth = DjangoAuthExtended(
baseUrl: 'https://your-django-backend.com/api',
);
await auth.logout();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('已注销')),
);
}