主要是为了配合domoticz系统进行关键词匹配,进而通过domoticz接口控制相关的设备。
代码地址:https://github.com/obaby/Pif3t
为了防止页面加载的时候加载所有的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" %} <div align="center"> <div id="header-search-box"> <form role="search" method="get" id="searchform" action="/search/"> {% csrf_token %} <input type="search" name="q" placeholder="Search" required {% if q %} value={{ q|safe }} {% endif %}/> <button type="submit">搜索</button> </form> </div> </div> |
只需要修改 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 |