使用 Google App Engine 和 Django 将第三方库 (twilio) 添加到项目中
Posted
技术标签:
【中文标题】使用 Google App Engine 和 Django 将第三方库 (twilio) 添加到项目中【英文标题】:Adding a third-party library (twilio) to project using Google App Engine and Django 【发布时间】:2018-01-18 13:31:18 【问题描述】:每个人。
我是这个领域的新手。我使用 django 框架使用谷歌应用引擎开发 Web 应用程序。我有一个关于 python lib dir 问题的疑难解答... ImportError: no module named...
我的 appengine_config.py 文件是
# [START vendor]
from google.appengine.ext import vendor
vendor.add('lib') # I believes this line is to add 'lib' folder to PATH.
# vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')) # <-- and I tried too this line.
# [END vendor]
我的“requirements.txt”文件是
mysql-python==1.2.5 #app engine django project default
Django==1.11.3 #app engine django project default
django-twilio # add i want
twilio # add i want
我使用pip install -t lib -r requirements.txt
安装
ROOT
├── lib
│ ├── django
│ ├── pytz
│ ├── wanttousing_lib
│ └── ...
├── mysite
│ ├── __init__.py
│ ├── settings.py
│ ├── controllers.py
│ ├── models.py
│ ├── views.py
│ ├── templates
│ └── ....
├── test
│ ├── like
│ │ ├── models_tests.py
│ │ └── controllers_tests.py
│ └── ....
├── static
│ ├── css
│ └── js
├── app.yaml
├── manage.py
├── appengine_config.py
├── requirement-vendor.txt
└── requirements.txt
所以,我在我的项目中安装了...但是..编译错误。
from wanttousing_lib import example_module
importError wanttousing_lib.......
但是,如果我将我的 wanttousing_lib 移动到 ROOT 目录,它可以工作.....
ROOT
├── lib
│ ├── django
│ ├── pytz
│
│ └── ...
├── mysite
│ ├── __init__.py
│ ├── settings.py
│ ├── controllers.py
│ ├── models.py
│ ├── views.py
│ ├── templates
│ │ └── like
│ │ ├── index.html
│ │ └── _likehelpers.html
│ └── ....
├── test
│ ├── like
│ │ ├── models_tests.py
│ │ └── controllers_tests.py
│ └── ....
├── static
│ ├── css
│ └── js
├── app.yaml
├── manage.py
├── appengine_config.py
├── requirement-vendor.txt
├── requirements.txt
└── wanttousing_lib <--- moved
--> 所有回溯。
Unhandled exception in thread started by <function wrapper at 0x103e0eaa0>
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/autoreload.py", line 227, in wrapper
fn(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 125, in inner_run
self.check(display_num_errors=True)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 359, in check
include_deployment_checks=include_deployment_checks,
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 346, in _run_checks
return checks.run_checks(**kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/checks/registry.py", line 81, in run_checks
new_errors = check(app_configs=app_configs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/checks/urls.py", line 16, in check_url_config
return check_resolver(resolver)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/checks/urls.py", line 26, in check_resolver
return check_method()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/urls/resolvers.py", line 254, in check
for pattern in self.url_patterns:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/urls/resolvers.py", line 405, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/urls/resolvers.py", line 398, in urlconf_module
return import_module(self.urlconf_name)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "ROOT/mysite/urls.py", line 19, in <module>
from polls.views import index
File "ROOT/polls/views.py", line 17, in <module>
from sms_twilio.tests import send_sms_test
File "ROOT/sms_twilio/tests.py", line 13, in <module>
from twilio import twiml
ImportError: No module named twilio
错误来源:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.test import TestCase
# Create your tests here.
from django.conf import settings
# file: your_code.py
# import twilio # no need for 'from lib import twilio'
# do stuff with twilio...
from twilio import twiml
from twilio.rest import Client
def send_twilio_message(to_number, body):
client = Client(
#client = twilio.rest.TwilioRestClient(
settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN)
return client.messages.create(
body=body,
to=to_number,
from_=settings.TWILIO_PHONE_NUMBER
)
def send_sms_test():
client = Client(
#client = twilio.rest.TwilioRestClient(
settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN)
return client.messages.create(
body="[TEST] SEND SMS !! HELLO !!",
to="TO_SENDER",
from_=settings.TWILIO_PHONE_NUMBER
)
也许,我是否将库列表添加到 app.yaml ? 喜欢
libraries:
- name: MySQLdb
version: 1.2.5
- name: twilio <-- like this
version: -
requirement-vendor.txt 文件是
Django==1.11.3
我该如何解决?请帮忙...
【问题讨论】:
请编辑您问题的标题,因为其中有错字。将其更改为“使用 Google App Engine 和 Django 将第三方库添加到项目中”之类的内容,以便更多遇到此问题的人可以在搜索结果中轻松找到它。 感谢您的意见。 @Maibi 你用什么版本的 pip 来安装你的需求?之后您是否在lib
中安装了twilio
模块(其中是否有__init__.py
)?
【参考方案1】:
前段时间我遇到了类似的问题,我没有使用vendor.add('lib')
,而是成功了:
vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))
我在步骤 4 中找到了解决方案 here in the docs 在 GAE 上使用第三方库:
要将库复制到您的项目中:
创建一个目录来存储您的第三方库,例如 lib/。
mkdir lib
使用带有 -t 标志的 pip(版本 6 或更高版本)将库复制到您在上一步中创建的文件夹中。例如:
pip install -t lib/ <library_name>
(Using Homebrew Python on Mac OS X?)
在与您的
app.yaml
文件相同的文件夹中创建一个名为appengine_config.py
的文件。编辑
appengine_config.py
文件并将您的库目录提供给vendor.add()
方法。# appengine_config.py from google.appengine.ext import vendor # Add any libraries install in the "lib" folder. vendor.add('lib')
上面的
appengine_config.py
文件假定当前工作目录是lib 文件夹所在的位置。在某些情况下,例如单元测试,当前工作目录可能不同。为避免错误,您可以使用以下命令显式传递 lib 文件夹的完整路径:vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))
【讨论】:
嗨,我已经尝试使用 'vendor.add(os.path.join(os.path.dirname(os.path.realpath(file)), ' lib'))' 这一行。但它没有用。也许,我是否添加'库:-名称:django版本:“1.4”-名称:twilio @Maibi 否 - 这仅适用于 Google 提供的运行时库(不包括 twilio),请参阅 cloud.google.com/appengine/docs/standard/python/tools/…【参考方案2】:我的 python lib 的目录是两个目录。
1) /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/...
2) /usr/local/lib/python2.7/...
我的项目指向 1),但 pip install 指向 2)...
我试过 1) ./pip install twilio
。所以,它有效!
谢谢。
【讨论】:
以上是关于使用 Google App Engine 和 Django 将第三方库 (twilio) 添加到项目中的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud 中的 Google Compute Engine、App Engine 和 Container Engine 有啥区别?
连接 Google App Engine 和 Google Compute Engine
使用 Google App Engine 时 SSL 证书无效和/或丢失
Google App Engine Flexible 和 Google Container Engine 之间的区别?