小编Aiv*_*nF.的帖子

Python 无法解析带有额外尾随逗号的 JSON

这段代码:

import json
s = '{ "key1": "value1", "key2": "value2", }'
json.loads(s)
Run Code Online (Sandbox Code Playgroud)

在 Python 2 中产生此错误:

ValueError:期望属性名称:第 1 行第 16 列(字符 15)

Python 3 中的类似结果:

json.decoder.JSONDecodeError:期望用双引号括起来的属性名称:第 1 行第 16 列(字符 15)

如果我删除尾随逗号(在 之后"value2"),则不会出现错误。但是我的代码会处理许多不同的 JSON,所以我无法手动完成。是否可以将解析器设置为忽略这样的最后一个逗号?

python parsing json runtime-error

6
推荐指数
2
解决办法
3457
查看次数

微服务集群中的授权架构

我有一个具有微服务架构的项目(在 Docker 和 Kubernetes 上),2 个主要应用程序是使用 AIOHTTP 和 Django 用 Python 编写的(还有 Ingress 代理、静态文件服务器,还有一些是用 NginX 制作的)。我想将这些 Python 应用程序拆分为单独的较小的微服务,但为了实现这一目标,我可能还应该将身份验证移至单独的应用程序中。但我该怎么做呢?

也许我还应该补充一点,我问的不是特定的身份验证方法,如 OAuth、JWT 等,而是关于集群架构内部的依赖关系和职责划分。

在我看来,一个很好的解决方案是 Ingress NginX 代理服务器的一些插件,或者之前的微服务,这样我的 Python 身份验证代理就不会关心方法目的地,比如一些中间件,只需读取标头/cookie,检查访问令牌或者sessionId,如果访问有效则设置userId,并进一步传递请求。

下面介绍了一个简短且简化的架构:

当前架构

这是我的想象,少提一些复杂的联系:

所需的架构

但我不确定这是否合理。此外,这种方法会减少 K8s Ingress 的优势,K8s Ingress 提供了用于从 bash 更新路径表的惊人接口,但据我所知,不允许在它之前运行任何请求处理程序,所以我必须运行自定义 NginX 代理,无需良好的 K8s 集成。

那么,还有哪些其他可能的架构解决方案呢?

我只能想象创建一个请求处理程序,它执行所有授权并将请求传递给其他微服务(或通过 RPC),这些微服务不关心身份验证,但我不认为这通常是完美的解决方案。

python architecture authentication proxy kubernetes

6
推荐指数
1
解决办法
4036
查看次数

Python Tortoise-ORM:在 __str__ 中使用相关模型字段

我正在使用 AIOHTTP 开发 API 服务,尝试集成一些异步 ORM,第一个候选者是 Tortoise-ORM。在 Django 项目中,我有很多链接模型,其__str__方法如下:

from tortoise.models import Model
from tortoise import fields

class Department(Model):
    id = fields.IntField(pk=True)
    title = fields.TextField()
    upper = fields.ForeignKeyField('models.Department', related_name='children')

    def __str__(self):
        if self.upper is not None:
            return f'{self.id} Department {self.title} of {self.upper.title}'
        else:
            return f'{self.id} Department {self.title}, head'

class Employee(Model):
    id = fields.IntField(pk=True)
    name = fields.TextField()
    dep = fields.ForeignKeyField('models.Department', related_name='employees')

    def __str__(self):
        return f'{self.id}. Employee {self.name} of {self.dep.title}'
Run Code Online (Sandbox Code Playgroud)

以便每个对象在描述中显示其相关模型。但在 Tortoise 中我得到一个错误:

AttributeError:“QuerySet”对象没有属性“title”

我想不可能在__str__方法中等待查询。那么,是否有可能使用相关模型的字段来使用 Tortoise-ORM 创建对象表示?

python orm python-asyncio aiohttp tortoise-orm

4
推荐指数
1
解决办法
7901
查看次数

对象有效时,NSDictionary writeToFile失败,权限为0k

为什么NSDictionary不能写?我已经检查了字典的内容:所有实例都是NSString和的NSNumber。我检查了权限:在相同路径下具有相同名称的文本文件写得很好。当然,我的字典不是空的。

NSString *file = ...
NSDictionary *dict = ...

// check dictionary keys
BOOL wrong = NO;
for (id num in [dict allKeys]) {
    if (![num isKindOfClass:[NSNumber class]]) {
        wrong = YES;
        break;
    }
}
if (wrong) {
    NSLog(@"First");
}
// check dictionary values
wrong = NO;
for (id num in [dict allValues]) {
    if (![num isKindOfClass:[NSString class]]) {
        wrong = YES;
        break;
    }
}
if (wrong) {
    NSLog(@"Second");
}

if (![dict writeToFile:file atomically:YES]) …
Run Code Online (Sandbox Code Playgroud)

macos file objective-c nsdictionary

3
推荐指数
1
解决办法
685
查看次数

Celery .delay() 同步工作,不延迟

我有一个带有 Celery 背景和周期性任务的 Django 项目。我在一年前开始工作进程,并且定期任务运行良好。但是,我刚刚发现调用异步函数主服务器代码不起作用,apply_async()/delay()导致函数的同步执行就像不使用它们一样。我该如何解决问题?我的 Celery 版本是 4.2。这是我的芹菜设置文件:

import os
from celery import Celery
from django.conf import settings

broker_url = 'amqp://<user>:<password>@localhost:5672/{project}'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyProject.settings')

app = Celery('<project>', broker=broker_url)

app.config_from_object('django.conf:settings')
app.conf.update (
    CELERY_TASK_SERIALIZER='json',
    CELERY_ACCEPT_CONTENT=['json'],
    CELERY_RESULT_SERIALIZER='json',
    CELERYD_HIJACK_ROOT_LOGGER=False,
    BROKER_URL=broker_url,
    CELERY_RESULT_BACKEND='djcelery.backends.database.DatabaseBackend',
    CELERY_ALWAYS_EAGER=True,
)
Run Code Online (Sandbox Code Playgroud)

这是我的测试代码:

from general.celery import app
from time import sleep

@app.task
def fun():
    for i in range(5):
        print('Sleeping')
        sleep(2)
    print('Awake')

def test():
    print('Begin')
    fun.apply_async(countdown=10)
    print('End')
Run Code Online (Sandbox Code Playgroud)

它导致立即输出:

Begin
Sleeping
...
Run Code Online (Sandbox Code Playgroud)

我还检查了芹菜的inspect

from celery.task.control import inspect
print(inspect().stats())
Run Code Online (Sandbox Code Playgroud)

它描述了以下状态:

{ …
Run Code Online (Sandbox Code Playgroud)

python django asynchronous rabbitmq celery

2
推荐指数
1
解决办法
4154
查看次数

Django:handler403 不起作用,但 404 起作用

这是MyProj/urls.py 的内容:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('general.urls')), # Main app
]

handler403 = 'general.views.handler403'
handler404 = 'general.views.handler403'
Run Code Online (Sandbox Code Playgroud)

如您所见,两个处理程序都指向同一个视图,而我最需要的第一个视图不起作用!例如,其他用户的数据/obj/12显示默认浏览器403页面:

[22/Jan/2019 08:39:14] "GET /obj/12 HTTP/1.1" 403 0

但第二个运行良好并显示正确的页面(当尝试访问一些不存在的数据时/obj/768)。为什么以及如何解决?

调试模式关闭。我的 Django 版本是 2.0.6

更新。

handler403.py文件的内容:

from django.shortcuts import render_to_response

def handler403(request, *args, **argv):
    print('Handler 403 was called!')
    u = request.user
    params = {
        'user': u,
    }
    response = render_to_response('403.html', params)
    response.status_code = 403
    return response …
Run Code Online (Sandbox Code Playgroud)

python django http-status-code-403 server

2
推荐指数
1
解决办法
1456
查看次数