小编Jaz*_*aza的帖子

通过辅助表的字段过滤关系的backref

我有一套相当复杂的sqlalchemy模型(所有模型都使用DeclarativeBase声明,通过flask-sqlalchemy的db.Model类).业务逻辑如下:

  • 每个任务都有一个或多个问题
  • 每个问题都有一个或多个选项
  • 用户可以进行提交,其中包含一个或多个问题的答案(来自一个或多个任务)

我准备了一个示例应用程序来演示核心功能:

#!/usr/bin/env python

from __future__ import print_function

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import sqlalchemy_defaults
from flask.ext.script import Manager, Server


app = Flask(__name__)

app.config.update(
    DEBUG=True,
    SQLALCHEMY_DATABASE_URI=(
        'postgresql://sqlareltest:sqlareltest' +
        '@localhost:5432/sqlareltest'),
)

db = SQLAlchemy(app)
db.Column = sqlalchemy_defaults.Column
sqlalchemy_defaults.make_lazy_configured(db.mapper)


class Task(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(255), default='')

    def __repr__(self):
        return self.title


class Submission(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(255), default='')

    def __repr__(self):
        return self.title


class TaskQuestion(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    task_id = db.Column(db.Integer, …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy relationship

7
推荐指数
0
解决办法
507
查看次数

Google OAuth 令牌请求返回“invalid_client”:“未授权”

试图让 OAuth2 Google 登录工作,这是我的应用程序发出的原始请求:

方法: POST

网址: https://www.googleapis.com/oauth2/v3/token

标题: Content-Type: application/x-www-form-urlencoded

价值观:

client_idXXX-0123456789abcdef0123456789abcdef.apps.googleusercontent.com

client_secretA1b2C3d4E5f6G7h8I9j0K1l2M

code1/A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v

grant_typeauthorization_code

redirect_urihttp://localhost:5000/callback/google/

这是回应:

地位: 401 Unauthorized

身体:

{
    "error": "invalid_client",
    "error_description": "Unauthorized"
}
Run Code Online (Sandbox Code Playgroud)

已验证这是我的应用程序正在制作的确切请求/响应(使用 Flask 和 rauth 的 Python 应用程序),并已验证我可以使用 Postman 重现完全相同的请求/响应。

根据其他线程中的说明,我在 Google API 控制台中完成了以下所有操作:

  • 在“OAuth 同意屏幕”设置中,将“产品名称”设置为与“项目名称”不同的内容
  • 同样在“OAuth 同意屏幕”设置中,仔细检查电子邮件是否已设置
  • 启用 Google+ API
  • 启用 Gmail API
  • 重新创建客户端 ID/秘密
  • 仔细检查客户端 ID/秘密值中是否没有前导或尾随空格,我已从 API 控制台正确复制它们

无论我做什么,仍然得到相同的响应"invalid_client": "Unauthorized"

对此的帮助将不胜感激。我正在尝试在我的应用程序中设置 OAuth2 驱动的“使用 X 登录”功能,已经让 Facebook 和 Twitter 正常工作,也想让 …

python oauth google-api google-oauth rauth

7
推荐指数
1
解决办法
1万
查看次数

Delta E(CIE Lab)在SQL中的性能计算和排序

我有一个数据库表,其中每一行都是一种颜色.我的目标:给定输入颜色,计算它与DB表中每种颜色的距离,并按该距离对结果进行排序.或者,作为用户故事说明:当我选择一种颜色时,我希望看到与我选择的颜色最相似的颜色列表,其中最接近的匹配位于列表顶部.

据我所知,为了做到这一点,各种Delta E(CIE Lab)公式是最佳选择.我无法找到公式的任何本机SQL实现,所以我编写了自己的SQL版本的Delta E CIE 1976Delta E CIE 2000.我根据python-colormath实现生成的结果验证了公式的SQL版本的准确性.

1976年的公式很容易用SQL或任何其他语言编写,因为它是一个简单的欧几里德距离计算.对于我来说,它对任何大小的数据集执行得很好而且快速(在具有100,000行的颜色表上测试它,并且查询花费不到1秒).

相比之下,2000年的公式非常漫长而复杂.我设法在SQL中实现它,但它的性能不是很好:查询10,000行大约需要5秒,查询100,000行大约需要1分钟.

我写了一个名为colorsearchtest示例应用程序(在Python/Flask/Postgres中),以解决我的实现问题(我在Heroku上设置了一个演示).如果您试用这个应用程序,您可以清楚地看到1976年和2000年Delta E查询之间的性能差异.

这是颜色表的模式(对于每种颜色,它存储相应的RGB和Lab表示,作为三个数值):

CREATE TABLE color (
    id integer NOT NULL,
    rgb_r integer,
    rgb_g integer,
    rgb_b integer,
    lab_l double precision,
    lab_a double precision,
    lab_b double precision
);
Run Code Online (Sandbox Code Playgroud)

这是表格中的一些数据(所有颜色都是随机颜色,由我的应用程序中的脚本生成):

INSERT INTO color (id, rgb_r, rgb_g, rgb_b, lab_l, lab_a, lab_b)
VALUES (902, 164, 214, 189, 81.6521019943304793,
        -21.2561872439361323, 7.08354581694699004);

INSERT INTO color (id, rgb_r, rgb_g, …
Run Code Online (Sandbox Code Playgroud)

algorithm postgresql colors query-performance flask

5
推荐指数
1
解决办法
1509
查看次数

gpg1密钥的gpg2导入失败(gpg 2.1.15,Ubuntu 17.10)

当我尝试使用gpg2导入导出良好的gpg1密钥时,公钥导入工作正常:

gpg --import /path/to/publickey.gpg

gpg: directory '/home/me/.gnupg' created
gpg: new configuration file '/home/me/.gnupg/dirmngr.conf' created
gpg: new configuration file '/home/me/.gnupg/gpg.conf' created
gpg: keybox '/home/me/.gnupg/pubring.kbx' created
gpg: /home/me/.gnupg/trustdb.gpg: trustdb created
gpg: key ABCDEF1234567890: public key "Me <me@me.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
Run Code Online (Sandbox Code Playgroud)

但是导入密钥失败(注意:使用时的结果相同--allow-secret-key-import):

gpg --import /path/to/secretkey.gpg

gpg: key ABCDEF1234567890: "Me <me@me.com>" not changed
gpg: key ABCDEF1234567890/ABCDEF1234567890: error sending to agent: No such file or directory
gpg: error building skey array: No such file or directory
gpg: …
Run Code Online (Sandbox Code Playgroud)

ubuntu gnupg

5
推荐指数
1
解决办法
2225
查看次数