这段代码:
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,所以我无法手动完成。是否可以将解析器设置为忽略这样的最后一个逗号?
我有一个具有微服务架构的项目(在 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),这些微服务不关心身份验证,但我不认为这通常是完美的解决方案。
我正在使用 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 创建对象表示?
为什么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) 我有一个带有 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) 这是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 ×5
django ×2
aiohttp ×1
architecture ×1
asynchronous ×1
celery ×1
file ×1
json ×1
kubernetes ×1
macos ×1
nsdictionary ×1
objective-c ×1
orm ×1
parsing ×1
proxy ×1
rabbitmq ×1
server ×1
tortoise-orm ×1