django @admin.register 非线程安全陷阱

一直以为注册的 ModelAdmin 是线程安全的,直到最近看到有人提到 ModelAdmin 不是线程安全的。

然后看了一下 Django admin.register 的源码,才发现确实不是线程安全的。 核心代码 如下:

# Instantiate the admin class to save in the registry
self._registry[model] = admin_class(model, self)

当配置如下代码后:

@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
    pass

实际上注册的是一个 FooAdmin 实例,也就是说 FooAdmin 这个类在启动的时候就实例化了,所有的请求访问的都是同一个实例。 所以类似下面的代码就会有非线程安全的问题,因为 FooAdmin 实例 ...

more ...

配置应用在 django admin 中显示的名称和顺序

Date Category django

在 Django 1.7 之前,要想修改应用在 admin 中的名称的话,必须得 hack Django 代码。 好消息是 Django 1.7+ 支持 配置应用的名称等信息 了。先看效果:

image

下面详细讲一下配置方法。

  1. 定义一个继承 AppConfig 的子类:

    # foo/apps.py
    from django.apps import AppConfig
    
    class FooConfig(AppConfig):
        name = 'foo'  # app 名称,可以 import 的路径, 比如 foo.bar.foobar
        verbose_name = '1名称1'   # 后台显示的名称
    
  2. 然后应用配置 ...

more ...

JSON Web Token (JWT) 简介

Date Modified Category web Tags jwt

JSON Web Token (JWT) 是一种基于 token 的认证方案。

JSON Web Token 的结构

一个 JWT token 看起来是这样的:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjEzODY4OTkxMzEsImlzcyI6ImppcmE6MTU0ODk1OTUiLCJxc2giOiI4MDYzZmY0Y2ExZTQxZGY3YmM5MGM4YWI2ZDBmNjIwN2Q0OTFjZjZkYWQ3YzY2ZWE3OTdiNDYxNGI3MTkyMmU5IiwiaWF0IjoxMzg2ODk4OTUxfQ.uKqU9dTB6gKwG6jQCuXYAiMNdfNRw98Hw_IWuA5MaMo

可以简化为下面这样的结构:

base64url_encode(Header) + '.' + base64url_encode(Claims) + '.' + base64url_encode(Signature)
more ...

在 python 中使用 str.strip 方法时需要注意的地方

Date Category python

首先问大家一个问题:你觉得下面代码的输出会是什么?

print '12345-abc-12345-defg-54321'.strip('12345')

我猜有些同学的答案会是: -abc-12345-defg-54321 ,实际的结果是:

>>> print '12345-abc-12345-defg-54321'.strip('12345')
-abc-12345-defg-

为什么不是 -abc-12345-defg-54321 呢?我们先来看一下 str.strip 的文档就知道了:

S.strip([chars]) -> string or unicode

Return a copy of the string S with leading and trailing
whitespace removed.
If chars is given and not None, remove characters in ...
more ...

微信开发过程中遇到的问题

JSSDK

invalid signature, 排查:

前端:

  • url 参数动态获取

  • 注意参数大小写:

    appId: '',         //  I 大写
    timestamp: 134xxx, // 全小写, 必须与后端签名时 timestamp 的值一致
    nonceStr: '',      //  ** 尤其注意 S 是大写 **, 必须与后端签名时 noncestr 的值一致
    

后端:

  • 确保 jsapi_ticket 未过期

  • 确认参与签名的参数,注意大小写:

    noncestr        // 全小写,** 尤其注意 s 是小写 **
    jsapi_ticket    // 全小写
    timestamp       // 全小写
    url             // 小写,必须是前端动态获取
    
  • 签名算法 * 是否按字段名的ASCII 码从小到大排序 * 使用 sha1 签名

微信支付 商户签名错误 ...

more ...