Django-Vue-Admin 是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
- 前端采用ruoyi-ui 、Vue、Element UI。
- 后端采用Python语言Django框架。
- 权限认证使用Jwt,支持多终端认证系统。
- 支持加载动态权限菜单,多方式轻松权限控制。
Django-Vue-Admin 是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
常用的代码保护不外乎下面几种方法:
发行 .pyc 文件 代码混淆 使用 py2exe 使用 Cython
django发布的需要以服务运行,通过其他的几种方法来实现保护,都不太现实。所以发布可以通过cython的方式实现。
1. 安装cython
pip3 install cython
2.在项目目录创建setup.py 编辑内容如下,其中“app/file1.py”是你所要打包的py文件名,这儿需要把app下所有的py文件都添加进来(当然也可以添加部分)
from distutils.core import setup from Cython.Build import cythonize fileSet = set() fileSet.add("UserBase/models.py") fileSet.add("UserBase/views.py") setup( ext_modules=cythonize(fileSet) )
通过官方文档https://docs.djangoproject.com/zh-hans/3.1/topics/db/multi-db/和csdnhttps://blog.csdn.net/songfreeman/article/details/70229839的这两篇文章可以进行多数据库的设置。但是设置后可能会出现问题,由于我连接的数据库是通过inspactdb的方法得到的model。于是在migrate的时候出现了问题,会提示 1146, “Table xxx doesn’t exist” 。后来发现问题可能出在路由表上,按照DATABASE_APPS_MAPPING映射之后,django默认的表如果要写入可能会找不到数据库。而源代码里的映射关系并不包含新加入的app,例如grappelli等。
DATABASE_APPS_MAPPING = {
# example:
# 'app_name':'database_name',
# 'admin': 'default',
# 'users': 'default', #django
'basic_estate': 'basic_estate',
'footstone': 'footstone',
'mall': 'hsmall',
'iot_biz': 'iot_biz',
'mall': 'mall',
'hsuser': 'hsuser',
}
为了防止页面加载的时候加载所有的Foreignkey到内存,django提供了一个raw_id_fields,该tupple内的数据将只展示id。虽然内存不加载了,但是基本没法看。不知道是个什么东西。
这尼玛tags和Porn model完全看不出是个什么东西。如果要展示相关的名称可以使用django-dynamic-raw-id:
A Django admin raw_id_fields widget replacement that handles display of an object’s string value on change and can be overridden via a template
使用方法: https://pypi.org/project/django-dynamic-raw-id/
具体效果:
嗯,非常直观~ 测试环境:python 3.7.2 + django 3.7.2
搜索功能效果很奇怪,输入的关键词,在重新模板化的时候被截断了。查看源代码可以发现value变成了情趣,内衣没了。所以输入框就剩下了情趣。检查了一下发现模板少了两个引号。
源代码:
{% include "header.html" %}
只需要修改 value=”{{ q|safe }}”即可。
ubuntu uwsgi 服务器启动之后 链接服务器提示500, 查看系统日志发现没有找到django模块。但是通过pip命令可以看到已经成功安装了。
猜测可能是python路径搜索问题导致的,随便搜了一下找到这么一篇文章:https://blog.csdn.net/dqchouyang/article/details/78762432
之前提到使用ratelimit来限制访问频率,我的目的是根据用户来限制访问频率,但是实际上通过下面的代码并没有达到效果,如果用多个浏览器进行同时刷新,会存在跳过限制的情况
@ratelimit(key='user', rate='1/8s', block=True, method=('POST'))
本来是不想重复造轮子的,但是由于这个轮子不大好用,于是只好重新造一个,基于redis可以使用下面的代码来实现(ttl为限制时长):
def set_method_limit(method_name, player_id, ttl):
cash_name = 'RATELIMIT::METHOD=' + method_name + 'PLAYERID=' + str(player_id)
cache.set(cash_name, method_name, ttl)
def check_is_limit(method_name, player_id):
cash_name = 'RATELIMIT::METHOD=' + method_name + 'PLAYERID=' + str(player_id)
if cash_name in cache:
return True
return False
def redis_ratelimit(method='ALL', block=False, ttl=5):
def decorator(fn):
@wraps(fn)
def _wrapped(*args, **kw):
# Work as a CBV method decorator.
request = args[0]
auth = request.META.get('HTTP_AUTHORIZATION', 'UNKNOWN')
# 获取用户id 如果失败则用token
try:
auth = request.user.id
print('PID= ' + str(auth))
except:
pass
token = str(auth).split(' ')[-1]
if check_is_limit(method, token) and block:
content = {
'status': 403,
'message': '大侠喝口茶,小女子给你讲个故事如何?\r\n 从前有座山,山上有座庙……',
}
return JsonResponse(content)
# raise Redis_Rate_Limit()
set_method_limit(method, token, ttl)
return fn(*args, **kw)
return _wrapped
return decorator
使用方法和retalimit一致:
@api_view(['POST', 'GET'])
@redis_ratelimit(method='api_test', block=True, ttl=10)
@csrf_exempt
def api_test(request):
"""
测试接口
http://192.168.1.195:8006/rest-api/battle/api-test/
:return: 普通数据测试
"""
return json_response_message(status=API_SUCCESS, message=timezone.now().date())
redis 安装:
pip3 install django-redis