编码员们好!
本文介绍了如何将**Django和React捆绑在一起,并编写一个可以在多个项目中重复使用的全栈模板**。对于新手来说,Django是一个用于后台开发的领先的Python框架,而React是最流行的JS库,用于编码由Facebook支持的用户界面。为了使这篇文章更加有用,我们提供了一份带有开源全栈启动器的短名单。
谢谢你的阅读!- 内容由**App Generator**提供。
- 第一节:项目总览
- 第2节:Django--简短介绍
- 第3节:什么是React
- 第4节:设置Django API后端
- 第5节:使用POSTMAN测试Django API
- 第6节:编写React UI代码与Django通信
- 第7节:编译样本(后端和前端)
注意:所有文章资源都可以从Github下载。
React仪表板被配置为与一个简单的Django API服务器一起工作。如需支持,请随时在Discord上提出任何问题。
- Django API Server- 开源项目(MIT License)
- React Berry Dashboard- 兼容的React Dashboard
1# - 项目概述
在过去的几年里,Web开发已经有了很大的发展,我们可以用不同的组合和模式来编码相同的功能。例如,如果我们的目标是建立一个简单的单页网站,我们可以使用Wix、Gatsby、Next、Eleventy(11ty),或者老式的Php与jQuery捆绑。 可能性是无限的,最终的堆栈取决于许多因素:我们所知道的技术,项目预算,以及学习新东西的意愿。 在这篇文章中,我们将重点介绍一个现代的堆栈,它使用Django作为后台技术,并使用React驱动的简单UI。
该产品将使用一个 "两层 "架构,React前端通过一个由Django驱动的简单API与后端进行通信。
它是如何工作的
- Django API暴露了一个简单的认证接口。
- React UI由浏览器启动和加载
- UI在启动时启动登录,并对用户进行认证。
- 服务器获得用户的证书并允许登录
- React得到服务器的响应
- 用户可以访问React UI的私人页面。
要完成本教程,工作站必须安装一些工具和库,用于编辑和编译这个基本的模板。让我们从必须安装的开始。
- Node JS- 由React UI使用
- Python v3- Django使用的语言
- GIT- 命令行版本控制工具
- PIP- 由Python3提供的官方软件包管理器
- NPM- 一个用于Javascript的软件包管理器
- (可选)Yarn- 一个比NPM更快的替代品
- (可选)VsCode或 Atom - 现代代码编辑器
在这个过程中,能够使用系统控制台工作可能是一个加分项。
2# -什么是Django
Django是一个现代的网络框架,它具有 "包含电池 "的概念,这意味着它为现代网络开发中需要的许多常见功能提供了模块和库。
- 基于会话的认证
- 通过一个强大的ORM进行抽象的数据库访问
- 内置的安全模式
- 辅助工具:表单、模型和数据验证
Django可以通过多种方式安装,最推荐的方式是使用PIP,即官方的Python软件包管理器。下面是带有命令的完整列表。
步骤#1- 创建一个虚拟环境
$ # Create the environment
$ virtualenv env
$
$ # Activate the virtual environment
$ source env/bin/activate
第2步- 安装最新的Django版本
$ pip install Django
步骤#3- 建立一个基本的Django项目
$ mkdir hellodjango
$ cd hellodjango
$
$ django-admin startproject config .
第4步 - 启动该项目
$ python manage.py runserver
如果一切顺利,我们应该在访问http://localhost:8000 ,看到默认的Django闪屏。
3# -什么是React
React是一个开源的前端JavaScript库,用于构建用户界面或UI组件。它由Facebook以及个人开发者和公司组成的社区维护。React可以作为开发单页或移动应用程序的基础。
另一个重要的事实是它的受欢迎程度:2021年的统计数据显示,React被用作前端开发的主要技术,超过了Vue、Angular或Svelte等其他框架。关于这个神奇的库的更多信息,请随时访问。
通过遵循官方的React教程,我们只需在终端输入几个命令,就可以搭建一个项目骨架。
第1步- 安装create-react-app(CRA)工具
$ npm install -g create-react-app
第2步- 创建React应用骨架
$ npx create-react-app reactapp
第3步 - 安装React的依赖性
$ npm run start
// OR
$ yarn start
上述命令应该会自动打开浏览器窗口,打开React默认页面。
4# - 编写Django API后端代码
作为一个2003年首次发布的成熟框架,Django被称为一个完整的、batteries-included 的库。为了成功地服务于React接口,我们简单的Django服务器将使用JWT web tokens ,实现一个简单的认证服务,暴露一些基本方法。
/api/users/register: 创建一个新的用户/api/users/login: 验证一个现有的用户/api/users/logout:删除相关的JWT令牌/api/users/edit- 编辑与一个注册用户相关的信息
为了尽可能地保持简单,后端服务器将使用默认的SQLite持久化和Django REST框架(DRF)来实现API节点。
在之前创建的项目中,让我们创建一个新的Django应用程序,名为 "API"。
$ cd hellodjango
$ python manage.py startapp app
startapp 命令应该创建一个新的目录api ,其结构是这样的。
api/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
创建一个API接口来管理事务,通常是这样的。
- 创建模型
- 创建序列化器
- 编写视图或视图集
- 通过创建路由来注册视图集
下面是一个简单的用户模型定义。
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(db_index=True, max_length=255)
email = models.EmailField(db_index=True, unique=True)
is_active = models.BooleanField(default=True)
date = models.DateTimeField(auto_now_add=True)
为用户模型创建序列化器
序列化器允许我们转换复杂的Django数据结构,如querysets或Python原生对象中的模型实例,可以很容易地转换JSON/XML格式,但序列化器也可以将JSON/XML序列化为原生Python。
class UserSerializer(serializers.ModelSerializer):
date = serializers.DateTimeField(read_only=True)
class Meta:
model = User
fields = ["id", "username", "email", "date"]
read_only_field = ["id"]
编写视图集的代码--代码将只提供给Login方法(完整的代码在文章末尾有)。
API接口的路由应该是这样的。
/api/users/register: 创建一个新用户/api/users/login: 验证一个现有的用户/api/users/logout:删除相关的JWT令牌/api/users/edit- 编辑一个注册用户的信息
ViewSet类带有内置的动作,如list,retrieve,create,update,destroy 。
from api.authentication.serializers import LoginSerializer
class LoginViewSet(viewsets.GenericViewSet, mixins.CreateModelMixin):
permission_classes = (AllowAny,)
serializer_class = LoginSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
return Response(serializer.validated_data, status=status.HTTP_200_OK)
Register the viewsets- 又称路由
from rest_framework import routers
from api.user.viewsets import UserViewSet
router = routers.SimpleRouter(trailing_slash=False)
router.register(r"edit", UserViewSet, basename="user-edit")
router.register(r"register", RegisterViewSet, basename="register")
router.register(r"login", LoginViewSet, basename="login")
router.register(r"checkSession", ActiveSessionViewSet, basename="check-session")
router.register(r"logout", LogoutViewSet, basename="logout")
urlpatterns = [
*router.urls,
]
初学者须知
以上部分旨在提出概念,而不提供完整的实现。好奇的人可以分析整个项目,发布在Github上。如有疑问,请随时在Discord中寻求支持。
- Django REST API- 源代码发布在Github上
5# - 使用POSTMAN测试Django API
一旦我们的API启动并运行,我们就可以使用POSTMAN,一个流行的免费工具来测试后端代码。我们假设Django API服务器是在5000端口启动的,并且注册方法是完整的代码和功能。
Postman - 创建一个新的集合和带有属性的请求
- 请求。POST over
http://localhost:5000/api/users/register - 头部内容类型。
application-json - 身体数据:
user/password和email
身体内容指定了新用户的证书。
注册API响应
在这一点上,用户在数据库中被创建,我们可以进行认证并继续我们的全栈项目。
6# - 代码React UI
本教程的React部分是在一个从Github上克隆的开源项目上编码的,React Berry Dashboard,一个由CodedThemes 提供的Material-UI模板。最初的项目,基本上是一个没有生命力的React模板,将用一些简单的功能进行改进。
- 与Django API兼容的可用的认证流程
- 行动。登录、注销和注册
- 访客用户被重定向到登录页面
- 私人页面只对已认证的用户可见。
React Berry - 从公共资源库克隆模板来源
$ git clone https://github.com/codedthemes/berry-free-react-admin-template.git
$ cd berry-free-react-admin-template
安装依赖性 - 通过NPM或Yarn
$ npm i
// OR
$ yarn
React Datta Able- 以开发模式启动项目
$ npm run start
// OR
$ npm start
为了编写新功能的代码,项目的依赖性应该用一些有用的库来更新。
一旦新的依赖项被正确安装,我们就可以继续编写代码了。
项目配置 - 后台API的URL
该应用程序将在不同的地方使用一组共同的变量导入,如登录、注销等。为了使我们的生活更轻松,在一个文件中定义所有的变量可能是一个好主意:src/config.js 。
const config = {
basename: '',
defaultPath: '/dashboard/default',
...
API_SERVER: 'http://localhost:5000/api/' <-- The magic line
};
export default config;
最重要的值是由API_SERVER 变量保存的,基本上是我们Flask API的地址。当项目进入生产阶段时,这个地址应该相应地更新为公共API的地址。
因为我们想重定向访客用户进行认证,所以提供了一个Guard Component来检查每个客户端请求的认证环境。
import React from 'react';
import { Redirect } from 'react-router-dom';
import { useSelector } from 'react-redux';
import { BASE_URL } from '../../config/constant';
const GuestGuard = ({ children }) => {
const account = useSelector((state) => state.account);
const { isLoggedIn } = account;
if (isLoggedIn) {
return <Redirect to={BASE_URL} />;
}
return <React.Fragment>{children}</React.Fragment>;
};
export default GuestGuard;
下一步是声明一个全局store ,用户的状态被保存在这里。redux-store 使用一些变量和对象以简单的方式提供这些信息。
export const initialState = {
token: '',
isLoggedIn: false,
isInitialized: false,
user: null
};
const accountReducer = (state = initialState, action) => {
switch (action.type) {
case ACCOUNT_INITIALIZE: {
const { isLoggedIn, user, token } = action.payload;
return {
...state,
isLoggedIn,
isInitialized: true,
token,
user
};
}
case LOGIN: {
const { user } = action.payload;
return {
...state,
isLoggedIn: true,
user
};
}
case LOGOUT: {
return {
...state,
isLoggedIn: false,
token: '',
user: null
};
}
default: {
return { ...state };
}
}
};
与当前用户相关的变量应根据会话中执行的操作进行更新。
- 访客访问:会话用户为Null,
isLoggedIn状态为false - 登录:用户被后端成功认证,并且。当然,
isLoggedIn状态变为真 - 注销:所有会话数据被删除,
isLoggedIn再次变成假的
在这一点上,React UI可以用来注册和认证用户。
7# - 编译免费样本
上述所有代码已经在Github上的两个独立项目中提供。
- Django API服务器- 开源项目(MIT许可)
- React Berry Dashboard- 兼容React Dashboard
第1步- 编译Django API服务器
$ git clone https://github.com/app-generator/api-server-django.git
$ cd api-server-django
$
$ virtualenv -p python3 venv
$ source venv/bin/activate
$
$ pip install -r requirements.txt
$
$ python manage.py migrate
$ python manage.py runserver 5000
在这一点上,我们可以使用POSTMAN来测试产品文档中描述的认证接口。统一API接口。
第2步- 编译React模板
$ git clone https://github.com/app-generator/react-berry-dashboard.git
$ cd react-berry-dashboard
$
$ npm i
$
$ npm run start
在这一点上,随着前端和后端启动和运行,我们可以开始使用这个由简单的Django API驱动的开源React UI。
谢谢你的阅读!
在这篇长文中,我们试图涵盖一个用React和Django构建的全栈模板的基本概念。更多资源,请访问。