【发布时间】:2020-05-25 21:58:32
【问题描述】:
当我尝试将用户传递给创建的项目模型时,我不断收到错误消息。 当通过 params["user"] 登录时,我可以访问用户对象并且我收到一条错误消息
我要做的与应用引擎 ndb 相同,并将用户与他们创建的记录相匹配,这样当他们登录时,他们只能查看他们的记录。所以我试图让某人登录并根据他们的登录信息,我们可以使用他们的信息来保存他们创建的项目。
以下是我对项目模型和 api 的一段代码
from flask import jsonify, make_response
import re
from datetime import datetime
from google.cloud import ndb
from google.cloud import storage
#from dateutil import tz
from models.v1.user import User
from models import get_db
class Project(ndb.Model):
user = ndb.KeyProperty(kind=User)
funds_raised = ndb.FloatProperty(default=0.0)
live_date = ndb.DateTimeProperty()
finish_date = ndb.DateTimeProperty()
created_on = ndb.DateTimeProperty(auto_now_add=True)
project_name = ndb.StringProperty(default='New Project')
project_image = ndb.BlobKeyProperty()
project_image_url = ndb.StringProperty(default='')
project_created_by = ndb.StringProperty(default='')
project_category = ndb.StringProperty(default='')
project_location = ndb.StringProperty(default='')
project_link = ndb.StringProperty(default='')
project_duration = ndb.StringProperty(default='')
@property
def project_url_name(self):
if not self.project_url_name_unique_key:
return None
return self.project_url_name_unique_key.id().rsplit(':', 1)[1]
# class methods (ordered by alphabet)
@classmethod
def create(cls, primary_contact_first_name, primary_contact_surname, primary_contact_email, project_name, project_status):
with client.context():
project = cls( primary_contact_first_name=primary_contact_first_name, primary_contact_surname=primary_contact_surname, primary_contact_email=primary_contact_email,
project_name=project_name, project_status=project_status)
project.put()
if project:
return True, project, "Success" # succes, project, message
else:
return False, project, "Project not created"
api的代码如下。
@login_required
def create_project(**params):
if request.method == "POST":
user = params["user"]
details = user.to_dict()
success, project, message = Project.create(
user = ndb.Key('User', user.get_id)
primary_contact_first_name=details.get('first_name'),
primary_contact_surname=details.get('last_name'),
primary_contact_email=details.get('email_address'),
project_name='New Project',
project_status=0
)
if success:
return make_response(jsonify({"Message" : message, "Project" : project.to_dict() }))
else:
return abort(403, description=message)
这是我的代码中出现的错误
File "/home/lenny/Desktop/flask_gae/utils/decorators.py", line 64, in wrapper
return func(**params)
File "/home/lenny/Desktop/flask_gae/handlers/campaigns/main.py", line 33, in create_project
user=ndb.Key('User', user.key),
File "/home/lenny/Desktop/flask_gae/env/lib/python3.7/site-packages/google/cloud/ndb/key.py", line 285, in __new__
client = context_module.get_context().client
File "/home/lenny/Desktop/flask_gae/env/lib/python3.7/site-packages/google/cloud/ndb/context.py", line 71, in get_context
raise exceptions.ContextError()
【问题讨论】:
-
这是您收到的全部错误消息吗?
-
@rsalinas 是的,它会抛出错误消息,即它期望来自 user.id 为 21 的用户的密钥
-
你能显示完整的回溯吗?
-
@DanCornilescu 添加了一些带有修改的回溯
标签: python-3.x google-cloud-datastore google-app-engine-python