我正在 GAE 中开发一个投票应用程序,我希望能够支持大量选民(比如 100,000)。我担心能够在不达到实体大小上限或任何其他限制的情况下执行此操作。这是我的实体关系的相关部分:
class Election(db.Model):
tmp_voters = db.StringListProperty(default = "")
class Voter(db.Model):
election = db.ReferenceProperty(Election, collection_name = "voters")
Run Code Online (Sandbox Code Playgroud)
当用户编辑选举时,我将选民电子邮件地址列表放入名为 tmp_voters 的 StringListProperty 中。就在选举开始之前,我为每个投票者创建一个投票者实体,每个投票者实体都有对选举实体的引用。
看来对于大量选民来说,tmp_voters会导致Election实体超出限制。是对的吗?我该如何解决这个问题?使用 blob 会是一个很好的解决方案吗?
拥有大量的 Voter 实体(每个实体都引用 Election 实体)是否会导致 Election 实体太大?即,添加对选举实体的引用是否会增加选举实体的大小?
对于大量选民,我还应该担心其他限制吗?(配额除外)
我有一个表格:
<textarea name="test">
Run Code Online (Sandbox Code Playgroud)
假设用户输入以下文本:
This is the first paragraph
It has two lines
This is the second paragraph
Run Code Online (Sandbox Code Playgroud)
我想把这个文本分成一个列表["这是第一段\n它有两行","这是第二段"]
我认为这会奏效:
temp = self.request.get("test")
list = re.split(r'\n\n', temp)
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.然而,
temp = self.request.get("test")
list = re.split(r'\n', temp)
Run Code Online (Sandbox Code Playgroud)
产生以下列表:["这是第一行","","这是第二行"]
我错过了什么?
也:
假设在to文本之间可能有一个或两个空行,这是否有意义?
temp = self.request.get("test")
list = re.split(r'(\n){2,3}', temp)
Run Code Online (Sandbox Code Playgroud)
解:
在下面的帮助下,
我发现以下代码适用于我的情况:
temp = self.request.get("test")
list = [l for l in temp.split('\r\n\r\n') if l.split()]
Run Code Online (Sandbox Code Playgroud)
我认为断线可能取决于输入来自哪个系统,因此它可能不是完美的解决方案.
我最近开始使用GAE和Python开发我的第一个Web应用程序,这很有趣.
我遇到的一个问题是当我不期望它们时会引发异常(因为我是网络应用程序的新手).我想要:
我应该在每次看到put和get的时候放一个try/except块吗?什么其他操作可能会失败,我应该用try/except包装?
我有一个谷歌应用程序脚本,它作为谷歌表格插件发布。该插件的功能之一是它获取单元格的值,查询 Google Big Query 表,并使用下拉选项填充下一个单元格。\xc2\xa0\xc2\xa0一旦用户选择一个选项另一个查询发送到 Big Query,依此类推。
\n因为此活动发生在用户编辑单元格\xc2\xa0 时,我认为我需要使用\xc2\xa0 onEdit()\xc2\xa0type 功能。然而,文档明确表明我可以\xe2\x80\x99t用来onEdit()发出需要授权的此类请求(我使用服务帐户),所以我需要使用触发器,并且因为它\xe2\x80\x99s用于附加我需要使用可安装的触发器。
我按照文档\xc2\xa0以编程方式执行此操作
\n/**\n\xc2\xa0* Creates a trigger for when a spreadsheet opens.\n\xc2\xa0*/\nfunction createSpreadsheetOpenTrigger() {\n\xc2\xa0 var ss = SpreadsheetApp.getActive();\n\xc2\xa0 ScriptApp.newTrigger(\'stu\')\n\xc2\xa0 \xc2\xa0 \xc2\xa0 .forSpreadsheet(ss)\n\xc2\xa0 \xc2\xa0 \xc2\xa0 .onEdit() //the docs actually is onOpen()\n\xc2\xa0 \xc2\xa0 \xc2\xa0 .create();\n}\nRun Code Online (Sandbox Code Playgroud)\n反过来,函数stu从单元格获取值并调用另一个查询 Big Query 的函数:
function stu(e) {\n var activeCell = e.range;\n var cellValue = e.value;\n....\n....\nif (wsName === "Targets" && c < 7 && r > 1) …Run Code Online (Sandbox Code Playgroud) 我们正在将现有的 Javascript Google 登录迁移到新的 Google OAuth 库,如此处弃用通知中所述 - https://developers.googleblog.com/2021/08/gsi-jsweb-deprecation.html
我们遵循本指南,我们的 javascript 代码如下所示:
const client = google.accounts.oauth2.initTokenClient({
client_id: <our-client-id>,
scope: 'https://www.googleapis.com/auth/userinfo.email \
https://www.googleapis.com/auth/userinfo.profile',
callback: (tokenResponse: any) => {
if (tokenResponse && tokenResponse.access_token) {
if (google.accounts.oauth2.hasGrantedAllScopes(tokenResponse,
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile')) {
console.log(tokenResponse.access_token );
.. further auth logic
}
}
}
});
client.requestAccessToken();
Run Code Online (Sandbox Code Playgroud)
从某种意义上说,一切工作正常,我能够从 Google 检索令牌,只是看起来新库生成的 JWT 令牌无效。更准确地说,它与 JWT 令牌规范不匹配 - 令牌不由 3 部分组成(标头/有效负载/签名)并且太短(意味着它可能不携带应携带的所有数据)。它也没有通过 https://jwt.io/中的验证
让我给你举个例子。
以前版本的库生成的令牌:
eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg2MTY0OWU0NTAzMTUzODNmNmI5ZDUxMGI3Y2Q0ZTkyMjZjM2NkODgiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy<...>1MWMifQ.OgOOhbTTbLYzcx NhNdvozf1<...>4bRLT3DILyWeO1FX64WaabGRjCR2amQ
新库生成的令牌:
ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv6qMpMkbNxW-ltOh49s6U4JKZNvPJV3d0TAE_rqqvkvVG2983ryewiufhdsklKGiH-vEdIs7u2389iwek-dcgkY1SE-b21g0932oiweKT-ZKTJvmHA是
因此,问题是新版本的库不会返回正确的 JWT 令牌(如上所述)。我们不能将这个新令牌用于任何用途,因为我们无法验证它的完整性(谁颁发的、令牌秘密是否与我们的应用程序 ID 匹配、令牌何时过期等)。
我还尝试使用 Google 自己的 OAuth 调试端点对此进行测试,但它也抱怨第二个令牌无效:
https://oauth2.googleapis.com/tokeninfo?id_token=ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv....
Run Code Online (Sandbox Code Playgroud)
注意:由于 …