主要是为了配合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" %}
只需要修改 value=”{{ q|safe }}”即可。
长时间没有使用支付宝的支付接口,再次实用的发现现在验签方式只剩ras2了。比较蛋疼的一点在于自己怎么处理都处理不对,于是使用支付宝的签名工具进行验签发现依然验证失败。
代码根据支付宝的相关文档进行了处理,但是依然失败。直到搜索到了这篇文章https://bbs.csdn.net/topics/392301160?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task,里面提到可能是签名工具版本的问题:
支付宝提供了RSA的验签生成工具,之前我使用的是1.0版的,生成的密钥可以支持支付,但是在回调的时候会校验失败,后面重新下载了1.3版的,就好了
之前提到使用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
不知道是阿里云的问题还是ubuntu本身的问题,今天安装mysqlclient提示:
/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto
collect2: error: ld returned 1 exit status
error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1
网上搜了一下没有发现类似的错误信息,于是转换思路直接搜索: /usr/bin/ld: cannot find -lssl 在这篇文章看到了解决方案:
https://blog.51cto.com/eminzhang/1285705
最近做了一个系统由于部分接口需要进行耗时操作,因而不希望用户进行频繁访问,需要进行访问频率限制。如果要自己实现一个访问限制功能相对来说也不会太复杂,并且网上有各种代码可以参考。如果自己不想实现这个代码可以使用 Django Ratelimit 。
Django Ratelimit is a ratelimiting decorator for Django views.
https://travis-ci.org/jsocol/django-ratelimit.png?branch=master
Code: https://github.com/jsocol/django-ratelimit
License: Apache Software License
Issues: https://github.com/jsocol/django-ratelimit/issues
Documentation: http://django-ratelimit.readthedocs.org/
使用方法也相对来说比较简单:
@ratelimit(key='ip', rate='5/m')
def myview(request):
# Will be true if the same IP makes more than 5 POST
# requests/minute.
was_limited = getattr(request, 'limited', False)
return HttpResponse()
@ratelimit(key='ip', rate='5/m', block=True)
def myview(request):
# If the same IP makes >5 reqs/min, will raise Ratelimited
return HttpResponse()
@ratelimit(key='post:username', rate='5/m', method=['GET', 'POST'])
def login(request):
# If the same username is used >5 times/min, this will be True.
# The `username` value will come from GET or POST, determined by the
# request method.
was_limited = getattr(request, 'limited', False)
return HttpResponse()
@ratelimit(key='post:username', rate='5/m')
@ratelimit(key='post:tenant', rate='5/m')
def login(request):
# Use multiple keys by stacking decorators.
return HttpResponse()
@ratelimit(key='get:q', rate='5/m')
@ratelimit(key='post:q', rate='5/m')
def search(request):
# These two decorators combine to form one rate limit: the same search
# query can only be tried 5 times a minute, regardless of the request
# method (GET or POST)
return HttpResponse()