我正在尝试将Google云端存储功能添加到已经运行了重要功能的Python GAE应用中.我在我的开发计算机上完全在PyCharm中工作,这是一台运行OS X 10.9.5的Mac.
我创建了一个包含此语句的新Python模块:
import cloudstorage as gcs
Run Code Online (Sandbox Code Playgroud)
如https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/getstarted中的示例代码所示
当我第一次添加该行时,PyCharm在编辑器中说"没有名为cloudstorage的模块".
然后,我按照https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download 上的"pip"和"svn"说明下载GCS客户端库.
在尝试遵循这些说明时,考虑到我之前使用此编程环境的经验,我实际上尝试过使用"pip"三次:
pip install GoogleAppEngineCloudStorageClient -t /Applications/GoogleAppEngineLauncher.app//Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib,因为我不确定"<your_app_directory/lib>"的含义是什么如上所述,我还执行了"svn"命令.然后,正如在Ubuntu 14.04上安装python google云存储客户端中所提到的,我运行了"cd gcs-client/src"和"sudo python setup.py install".我在用户根目录中运行了这些命令.
在GCS客户端库的每个成功但不同的安装之后,我查看了我的模块的PyCharm编辑器窗口,它总是具有相同的"没有名为cloudstorage的模块"错误.但作为一个实验,我也会尝试重启PyCharm,并尝试运行我的应用程序.
在某些时候,编辑器窗口停止显示错误.它不是在上面的一个步骤之后立即,而是在我离开阅读各种网页然后再回来再次查看错误之后.我不知道哪个安装是在PyCharm编辑器中摆脱错误消息的安装.
无论如何,每当我尝试运行应用程序时(再次在PyCharm中),我总是在同一个import语句中得到运行时错误"ImportError:No module named cloudstorage".
此应用程序的"运行/调试配置"页面同时选中"将内容根添加到PYTHONPATH"和"将源根添加到PYTHONPATH".
当然,我想要的主要帮助是如何通过"无模块名为cloudstorage"运行时错误,即使import语句不再显示错误.
我想我还有多达三个虚假版本的GCS客户端库.我更关心的是越过"未找到模块",因为它是一个显示阻止,但如果你有任何想法我怎么能删除虚假版本,以便他们不只是躺着,我会是最也感谢你的帮助.
背景
我们有一个大型的Ionic v1应用程序可以在Android上运行(通过Google Play商店获取),也可以通过"离子服务"在我们的开发机器上运行.
该应用使用Google App Engine(GAE)网站作为后端服务器.服务器通过cookie为每个用户维护会话.我们不会在会话中存储太多数据,但我们需要安全地识别发出每个请求的用户.当应用程序成功运行时,GAE服务器代码会创建一个包含会话ID的cookie,并在响应每个HTTP请求时将其发送到Ionic客户端代码.
请注意,Ionic代码不以任何方式访问cookie.只需要将相同的cookie与每个后续请求一起发送回GAE服务器,以便GAE代码识别用户.
目标
我们希望使用Firebase Hosting提供Ionic代码.事实上我们可以在两种模式中这样做:
一个.将Ionic代码保存在我们的开发机器上,运行"firebase serve",然后在浏览器上转到"localhost:5000"
湾 将Ionic代码部署到Firebase主机并在浏览器上转到"xxxx.firebaseapp.com"
一切正常!呃,除了一件小事,我们几周都试图解决这个问题......
问题
所使用的GAE代码来管理会话连续性,并通过GAE代码生成的HTTP请求的响应发送的cookie的,不回来,从火力地堡上运行的应用程序离子的下一个请求.因此,GAE应用程序始终响应,就像用户尚未登录一样.
事实上,进一步的测试表明,在响应发送的HTTP请求的会话cookie甚至不会在浏览器设置(所以当然这不是发送回GAE代码与下一个HTTP请求).后端服务器上的GAE代码始终响应,就好像这是会话的第一个HTTP请求一样.
我们消除了什么
问题不在于Ionic不支持cookie.我们知道这不是问题,因为该应用程序可以作为Android应用程序和"离子服务"运行良好.在这两种情况下,GAE后端都能够使用cookie来维护会话,以将会话ID从一个请求存储到下一个请求.
使用"memcache"而不是GAE会话支持的cookie不能解决问题,因为即使你使用memcache,你仍然需要会话ID的cookie.如果您愿意,可以使用默认设置,让GAE会话支持使用cookie; 在这种情况下,它将对会话ID和任何其他会话数据使用相同的cookie.
使用"__session"作为cookie的名称无法解决问题.Firebase确实支持使用这样的cookie名称,但显然仅在运行带有云功能的Firebase托管的环境中.云功能用于运行后端代码,而不是用户与之交互的客户端代码.我们无法看到将Ionic应用程序作为云功能运行.如果没有云功能,GAE后端设置的"__session"cookie显然会被运行应用程序的浏览器客户端以及所有其他cookie剥离.
加入"访问控制允许来源/ -Credentials/-方法/ -headers"报头到GAE码生成的响应,并设置crossDomain: true
xhrFields: { withCredentials: true }在客户机侧,没有改善的情况.仍然没有在浏览器上设置GAE代码的cookie.
任何帮助将非常感谢.
cookies google-app-engine cross-browser cross-domain ionic-framework
我有一个Python 2.7 GAE应用程序,它已经具有很多功能.现在我想要与Google API集成.
在我在Mac OSX上运行的IDE(PyCharm)中,我将以下行添加到我的应用程序的主程序中:
import httplib2
pass
Run Code Online (Sandbox Code Playgroud)
当我命令单击"httplib2"时,IDE 在编辑器面板中打开"httplib2-0.8-py2.7.egg/httplib2/init.py ",因此IDE显然知道httplib2在哪里.但运行应用程序,我得到标题中显示的错误.
为了进一步测试,我在上面显示的两个语句上放置了断点,然后在调试模式下运行应用程序.当它到达import语句时,我立即单击"Resume Program"图标.
然后控制台显示:
ImportError: No module named httplib2
Run Code Online (Sandbox Code Playgroud)
程序然后循环.也就是说,它不会终止,但它永远不会到达"通过"语句.
所以IDE似乎知道"httplib2"在哪里,但Python似乎并不存在.任何有关如何"导入httplib2"成功的帮助将不胜感激.谢谢.
我有一个现有的Google App Engine Python应用程序,它具有很多功能.我现在想要将Google云端硬盘集成到应用中.具体来说,我希望我的应用能够:
如果有人知道如何做我想做的事情,可以将我引导到符合我的SPECIFIC要求的SPECIFIC Google网页(不是像"DrEdit示例"这样的一般答案),我将永远感激不尽. .提前致谢!
更新:
根据drive-v2-python-appengine在答案1中的建议生成的示例代码,这是我的程序,其中包含用于创建空文件的RequestHandler:
import os
import webapp2
import io
from google.appengine.api import memcache
import httplib2
from apiclient.discovery import build
from apiclient.http import MediaIoBaseUpload
from oauth2client.appengine import oauth2decorator_from_clientsecrets
decorator = oauth2decorator_from_clientsecrets(
os.path.join(os.path.dirname(__file__), 'client_secrets.json'),
scope=[
'https://www.googleapis.com/auth/drive',
])
http = httplib2.Http(memcache)
drive_service = build("drive", "v2", http=http)
class CreateEmptyFile(webapp2.RequestHandler):
@decorator.oauth_required
def get(self):
body = {
'title': 'Sample Document',
'description': 'A sample document',
'mimeType': 'text/plain'
}
media_body = MediaIoBaseUpload(io.BytesIO(""), mimetype='text/plain', resumable=True)
file = drive_service.files().insert(body=body, …Run Code Online (Sandbox Code Playgroud) 我在内联模式下使用 CKEDITOR,每页有多个编辑器。为了创建它们,我<textarea>在 HTML 中使用标签,然后运行一个脚本,该脚本在CKEDITOR.inline()网页加载后立即针对每个标签执行。
只要我在“config.js”中定义最终配置,就可以正常工作,但我需要动态更新配置选项之一。
<textarea>这是我的脚本,在页面加载后使用 JQuery 循环遍历元素。作为诊断,我将语句CKEDITOR.replace()夹在中间alert。<textarea>此代码用编辑器替换第一个并显示第一个alert语句。但是,它在CKEDITOR.replace()语句期间退出并且从不显示第二个alert.
$(function () {
$("textarea").each(function () {
editor = CKEDITOR.inline($(this)[0]);
alert("Before replace, editor=" + editor);
CKEDITOR.replace(editor, {
filebrowserImageUploadUrl: "/new/url/to/be/executed"
});
alert("After replace");
})
});
Run Code Online (Sandbox Code Playgroud)
不仅第二个alert不执行,而且我尝试更新的配置选项仍然保留在“config.js”中。
我认为我需要指定“editor”以外的其他内容作为该CKEDITOR.replace()语句的第一个参数,但我不知道是什么。