django raw_id_fields 显示名称而不是id(raw_id_fields: How to show a name instead of id)

为了防止页面加载的时候加载所有的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

Continue Reading

Django input value值被截断

搜索功能效果很奇怪,输入的关键词,在重新模板化的时候被截断了。查看源代码可以发现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 }}”即可。

Continue Reading

ubuntu uwsgi No module named ‘django’

ubuntu uwsgi 服务器启动之后 链接服务器提示500, 查看系统日志发现没有找到django模块。但是通过pip命令可以看到已经成功安装了。

猜测可能是python路径搜索问题导致的,随便搜了一下找到这么一篇文章:https://blog.csdn.net/dqchouyang/article/details/78762432

Continue Reading

再谈《Django 限制访问频率》

之前提到使用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
Continue Reading