项目构建心得
- Python Django项目构建心得
- 一、基础
- 1.1 虚拟环境
- 1.1.1、安装
- 1.1.2、创建虚拟环境
- 1.1.3、激活、退出 虚拟环境
- 1.2 Django命令
- 二、项目构建
- 2.1 创建项目
- 2.2 构建分类配置文件
- 2.3 安装好项目所需要的插件环境并生成requirements.txt文件
- 2.4 将项目提交git
- 2.5 创建一个auth模块app,并加入到APPS
- 2.6 创建auth所需要的表,这里使用Mysql数据库
- 2.6.1 切换连接到Mysql数据库
- 2.6.2 编写models文件
- 2.7 编写登录接口和处理路由
- 2.7.1 安装配置redis连接
- 2.7.2 编写简单的ApiResult
- 2.7.2 编写登录接口
- 2.7.3 编写路由配置
- 2.7.4 编写认证装饰器 类似于SpringAOP
- 2.8 编写用户CRUD接口和处理路由
- 2.9 使用Django中间件实现访问日志记录和全局异常拦截
-
- 总结
Python Django项目构建心得
基于Python3.7
一、基础
1.1 虚拟环境
1.1.1、安装
pip3 install virtualenv
1.1.2、创建虚拟环境
virtualenv 环境名称 --python=python3.7
#创建的环境路径是在当前命令行所处路径下 比如:D:/python/环境名称,如果电脑上有多个Python版本可以指定对应版本python3.7,也可以直接使用python执行文件绝对路径:C:\python\python3.7.exe
1.1.3、激活、退出 虚拟环境
激活:
wim:
>>> cd Scripts 进入虚拟环境 Scripts目录
>>> activate.bat 激活虚拟环境
mac:
>>> source 环境名称/bin/activate
退出
wim:
>>> cd Scripts 进入虚拟环境 Scripts目录
>>> deactivate.bat 退出虚拟环境
mac:
>>> 任意目录 deactivate命令退出
#如果安装的是python3.7环境,建议使用Django1.11.28及以上版本
1.2 Django命令
1、创建Django项目
django-admin startproject 项目名称
2、启动服务器
python manage.py runserver 0.0.0.0:80
3、创建一个应用
python manage.py startapp sales
4、创建数据库
python manage.py migrate
5、检查项目指定模块common是否改变 如果有改变添加一个修改配置在对应app的migrations中
python manage.py makemigrations common
6、启动python shell脚本
python manage.py shell
二、项目构建
2.1 创建项目
项目基于Python3.7+Django1.11.28 使用自建虚拟环境创建
2.2 构建分类配置文件
引入代码
try:
from .local_settings import *
except ImportError:
pass
2.3 安装好项目所需要的插件环境并生成requirements.txt文件
1、生成requirements.txt文件
pip freeze > requirement.txt
2、安装requirements.txt文件中指定的所有插件
pip install -r requirements.txt
2.4 将项目提交git
提前在项目根目录创建一个.gitignore文件用于处理不需要提交的文件
.idea/
__pycache__/
*.py[cod]
*$py.class
*/migrations/*.py
!*/migrations/__init__.py
local_settings.py
*.sqllite3
2.5 创建一个auth模块app,并加入到APPS
2.6 创建auth所需要的表,这里使用Mysql数据库
2.6.1 切换连接到Mysql数据库
安装pip3 install mysqlclient
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'pet_home',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
2.6.2 编写models文件
from django.db import models
class Role(models.Model):
role_name = models.CharField(max_length=200)
class User(models.Model):
user_name = models.CharField(max_length=200)
account = models.CharField(max_length=200)
password = models.CharField(max_length=200)
roles = models.ManyToManyField(Role, through='UserRole')
class Menu(models.Model):
menu_name = models.CharField(max_length=200)
class UserRole(models.Model):
user = models.ForeignKey(User, on_delete=models.PROTECT)
role = models.ForeignKey(Role, on_delete=models.PROTECT)
class RoleMenu(models.Model):
role = models.ForeignKey(Role, on_delete=models.PROTECT)
menu = models.ForeignKey(Menu, on_delete=models.PROTECT)
在Terminal中执行生成语言
1、python manage.py makemigrations pet_auth
2、python manage.py migrate pet_auth
2.7 编写登录接口和处理路由
2.7.1 安装配置redis连接
1、因为保证登录状态需要使用redis首先安装redis
pip install django-redis==4.12.1
2、配置redis连接
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {
"max_connections": 1000,
"encoding": 'utf-8',
},
"DECODE_RESPONSES": True
}
}
}
2.7.2 编写简单的ApiResult
def success(data):
result={
"data": data,
"msg": "success",
"status": 200
}
return result
def error(msg):
result = {
"data": "",
"msg": msg,
"status": 500
}
return result
2.7.2 编写登录接口
from django.http import JsonResponse
from pet_auth.models import User
from utils.api import ApiResult
from django_redis import get_redis_connection
import uuid
conn = get_redis_connection("default")
def login(request):
account = request.GET.get("account", None)
password = request.GET.get("password", None)
try:
iuser = User.objects.get(account=account)
restUser = {
"userName": iuser.user_name
}
if (iuser.password != password):
print("密码错误")
return JsonResponse(ApiResult.error("密码错误"))
token = str(uuid.uuid4())
conn.set(token, str(restUser))
restUser["token"] = token
return JsonResponse(ApiResult.success(restUser))
except User.DoesNotExist:
print("用户不存在")
return JsonResponse(ApiResult.error("用户不存在"))
2.7.3 编写路由配置
2.7.4 编写认证装饰器 类似于SpringAOP
1、编写
from django.http import JsonResponse
from utils.api import ApiResult
from django_redis import get_redis_connection
conn = get_redis_connection("default")
def loginVal(func):
def wrapper(request):
print("认证装饰器")
token = request.META.get("HTTP_TOKEN")
redisToken = conn.get(token)
if (redisToken == None):
return JsonResponse(ApiResult.error("用户未登录", 401))
return func(request)
return wrapper
2、使用
2.8 编写用户CRUD接口和处理路由
@loginVal
def getUserInfo(request):
token = request.META.get("HTTP_TOKEN")
return JsonResponse(ApiResult.success(str(conn.get(token))))
@loginVal
def insertUser(request):
data = json.loads(request.body)
user = User.objects.create(user_name=data["userName"], password=data["password"], account=data["account"])
return JsonResponse(ApiResult.success(user.id))
@loginVal
def updateUser(request):
data = json.loads(request.body)
try:
user = User.objects.get(id=data["id"])
user.user_name = data["userName"]
user.password = data["password"]
user.account = data["account"]
user.save()
return JsonResponse(ApiResult.success(data))
except User.DoesNotExist:
return JsonResponse(ApiResult.error())
@loginVal
def deleteUser(request):
data = json.loads(request.body)
try:
user = User.objects.get(id=data["id"])
user.delete()
return JsonResponse(ApiResult.success(data))
except User.DoesNotExist:
return JsonResponse(ApiResult.error())
2.9 使用Django中间件实现访问日志记录和全局异常拦截
2.9.1 访问日志记录
1、编写日志记录中间件
from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse
from utils.api import ApiResult
class PetLog(MiddlewareMixin):
def process_request(self, request):
if request.META.get('HTTP_X_FORWARDED_FOR'):
ip = request.META.get("HTTP_X_FORWARDED_FOR")
else:
ip = request.META.get("REMOTE_ADDR")
print("请求IP: %s" % ip)
print("请求地址:%s" % request.path)
print("请求类型:%s" % request.method)
print("浏览器编码:%s" % request.encoding)
print("请求用户对象:%s" % request.user)
2、将中间件加入Django配置
2.9.2 全局异常拦截
1、编写自定义异常
class PublicException(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return repr(self.msg)
2、编写全局异常拦截中间件
from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse
from utils.api import ApiResult
class PetException(MiddlewareMixin):
def process_exception(self, request, exception):
msg = "异常"
if isinstance(exception,PublicException):
msg = exception.msg
return JsonResponse(ApiResult.error(msg))
3、将中间件加入Django配置
4、使用自定义异常 直接将自定义异常抛出 交给中间件处理
总结
构建的Django项目很简单有很多不足的地方,在实际项目开发中可以在此基础之上做优化,该项目Demo具备一般API项目该有的功能(全局异常捕获,全局异常处理,访问日志记录,用户登录状态,统一参数返回),在实际开发是可以使用中间件对XSS、敏感字等进行处理,用户登录状态也可以使用中间件实现效果会比装饰器要好,可以使用装饰器来进行权限的控制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)