我的API正在构建,以允许开发人员扩展其功能.我的计划是通过提供一个"扩展"目录来实现这一目的,他们可以放入蓝图,它们将被动态加载.这是我用来导入的代码(从本教程修改)
from flask import Flask
import pkgutil
import sys
app = Flask(__name__)
EXTENSIONS_DIR = "extensions"
modules = pkgutil.iter_modules(path=[EXTENSIONS_DIR])
for loader, mod_name, ispkg in modules:
if mod_name not in sys.modules:
# It imports fine
loaded_mod = __import__(EXTENSIONS_DIR+"."+mod_name+"."+mod_name, fromlist=[mod_name])
# It does not register
app.register_blueprint(loaded_mod)
Run Code Online (Sandbox Code Playgroud)
这是我的项目的目录布局.该extensions目录是开发人员放弃其扩展功能的目录.
/root
/extensions
/extension1
__init__.py
extension1.py
/extension2
__init__.py
extension2.py
simple_example.py
Run Code Online (Sandbox Code Playgroud)
问题是我得到了这个错误,并且不确定它告诉我的是什么.
>python simple_example.py
Traceback (most recent call last):
File "simple_example.py", line 14, in <module>
app.register_blueprint(loaded_mod)
File "C:\Python27\lib\site-packages\flask\app.py", line 62, in wrapper_func
return f(self, …Run Code Online (Sandbox Code Playgroud) 我有一个字典,每个键都有一个浮点值列表.这些列表的大小不同.
我想将这个字典转换为数据帧,以便我可以轻松地对数据执行一些分析功能(最小值,最大值,平均值,标准偏差等).
我的字典看起来像这样:
{
'key1': [10, 100.1, 0.98, 1.2],
'key2': [72.5],
'key3': [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7]
}
Run Code Online (Sandbox Code Playgroud)
是什么让这个成数据帧,这样我可以利用的最佳途径基本功能一样sum,mean,describe,std?
我找到的例子(如上面的链接)都假设每个键在列表中具有相同数量的值.
我有两个非常简单的模型.在我的Post模型中,应该有两个关系进入User表中.一个是帖子的所有者,一个是帖子的最后一个编辑.它们可以是不同的值,但两者都指向同一个User表.
我的模型是这样设置的
class Post(Base):
last_editor_id = Column(BigInteger, ForeignKey('users.id'), nullable=True)
last_editor = relationship('User', backref='posts', foreign_keys=[last_editor_id])
owner_id = Column(BigInteger, ForeignKey('users.id'), nullable=False, index=True)
owner = relationship('User', backref='posts', foreign_keys=[owner_id])
class User(Base):
'''This represents a user on the site'''
__tablename__ = 'users'
id = Column(BigInteger, primary_key=True, unique=True)
name = Column(BigInteger, nullable=False)
Run Code Online (Sandbox Code Playgroud)
当我尝试创建这些模型时,我收到以下错误
sqlalchemy.exc.ArgumentError: Error creating backref 'posts' on relationship 'Post.owner': property of that name exists on mapper 'Mapper|User|users'
Run Code Online (Sandbox Code Playgroud)
如何更正此问题,以便我可以在Post模型中维护两个forgeign键?
我的pandas数据框看起来与此类似:
TIMESTAMP EVENT_COUNT
0 2014-07-23 04:28:23 1
1 2014-07-23 04:28:24 1
2 2014-07-23 04:28:25.999000 4
3 2014-07-23 04:28:27 1
4 2014-07-23 04:28:28.999000 2
5 2014-07-23 04:28:30 1
6 2014-07-23 04:29:31 7
7 2014-07-23 04:29:33 1
8 2014-07-23 04:29:34 1
9 2014-07-23 04:29:36 1
10 2014-07-23 04:40:37 2
11 2014-07-23 04:40:39 1
12 2014-07-23 04:40:40 1
13 2014-07-23 04:40:42 1
14 2014-07-23 04:40:43 1
15 2014-07-23 04:40:44.999000 4
16 2014-07-23 04:41:46 1
17 2014-07-23 04:41:47 1
18 2014-07-23 04:41:49 1
19 …Run Code Online (Sandbox Code Playgroud) 我想使用Flask-Migrate并查看他们的示例:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
if __name__ == '__main__':
manager.run()
Run Code Online (Sandbox Code Playgroud)
这作为一个简单的播放示例很有用,但我有多个模型,我不想在这个脚本和定义我的应用程序代码的模型中定义模型.因此,我想将它们拉入我可以在两者之间共享的模型文件中.
我尝试通过将User类放入a models.py然后从那里导入User来尝试这样做.不幸的是,这会抛出一个NameError: name 'db' is not defined.
我的问题是:
db = SQLAlchemy(app)在my models.py中使用吗?如果是这样,我的迁移脚本和烧瓶应用程序本身都可以使用吗?models.py,我如何在不通过db所有文件的情况下在自己的文件中使用我的模型?我在继承的项目上有以下目录结构:
work_dir/
FlaskControlPanel/
static/
templates/
app.py
models/
__init__.py
model1.py
model2.py
script1.py
script2.py
Run Code Online (Sandbox Code Playgroud)
From script1.pyor script2.pyI can run this from models.model1 import Class1, Class2and it works。使用 PyCharm 时,我可以在app.py.
但是,当我在我的开发服务器上部署它时,这在app.py. 我收到错误ImportError: No module named models.model1
PyCharm 做了什么来解决这个问题?
app.py当我在开发服务器上运行 Flask 应用程序时,如何修复我的导入以在 PyCharm 中工作?我通常只python app.py在FlaskControlPanel目录中使用它在服务器上运行它。
我计划在我的项目中使用 GitPython。当我测试它时,使用此代码我收到一个错误。
repo.index.add(['*'])
repo.index.commit(message="Initial Commit")
repo.remotes.origin.push()
Run Code Online (Sandbox Code Playgroud)
错误是:
Traceback (most recent call last):
File "test.py", line 24, in <module>
repo.remotes.origin.push()
File "C:\Python27\lib\site-packages\git\remote.py", line 627, in push
return self._get_push_info(proc, progress or RemoteProgress())
File "C:\Python27\lib\site-packages\git\remote.py", line 564, in _get_push_info
finalize_process(proc)
File "C:\Python27\lib\site-packages\git\remote.py", line 64, in finalize_process
proc.wait()
File "C:\Python27\lib\site-packages\git\cmd.py", line 100, in wait
raise GitCommandError(self.args, status, self.proc.stderr.read())
git.exc.GitCommandError: 'git push --porcelain origin' returned exit status 128:
Run Code Online (Sandbox Code Playgroud)
在最后一行之后没有消息。但是,如果我git push --porcelain origin从命令行手动运行,则会收到错误消息:
fatal: could not read Username for 'https://github.com': No such file or …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序启动一系列线程.有时,其中一个线程死亡(通常是由于网络问题).如何正确检测线程崩溃并重新启动该线程?这是示例代码:
import random
import threading
import time
class MyThread(threading.Thread):
def __init__(self, pass_value):
super(MyThread, self).__init__()
self.running = False
self.value = pass_value
def run(self):
self.running = True
while self.running:
time.sleep(0.25)
rand = random.randint(0,10)
print threading.current_thread().name, rand, self.value
if rand == 4:
raise ValueError('Returned 4!')
if __name__ == '__main__':
group1 = []
group2 = []
for g in range(4):
group1.append(MyThread(g))
group2.append(MyThread(g+20))
for m in group1:
m.start()
print "Now start second wave..."
for p in group2:
p.start()
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我启动4个线程然后我开始4个线程.每个线程随机生成int介于0和10之间.如果int是4,则会引发异常.请注意,我没有 …
在我之前的问题中,我询问了如何模拟包含requests.get在我的班级中的班级。如果我只打电话一次,提供的答案效果很好requests.get。然而,事实证明我的课程比我做的例子更复杂。
我的班级打了request.get两次电话。一次是在初始化时,因为它到达一个 API 端点,该端点返回我需要在实际请求中使用的 API 值,一次是在我进行.fetch调用时。
import requests
class ExampleAPI(object):
def __init__(self):
self.important_tokens = requests.get(url_to_tokens)['tokens']
def fetch(self, url, params=None, key=None, token=None, **kwargs):
return requests.get(url, params=self.important_tokens).json()
Run Code Online (Sandbox Code Playgroud)
现在,事实证明我需要创建两个模拟响应。一种用于初始化,一种用于.fetch. 使用上一个答案中的代码:
@patch('mymodule.requests.get')
def test_fetch(self, fake_get):
expected = {"result": "True"}
fake_get.return_value.json.return_value = expected
e = ExampleAPI() # This needs one set of mocked responses
self.assertEqual(e.fetch('http://my.api.url.example.com'), expected) # This needs a second set
Run Code Online (Sandbox Code Playgroud)
如何为这两个单独的调用创建单独的响应request.get?
I have a CLI application built that uses grouped commands and sub-commands. Everything is working. However, I want to ensure this continues to be the case in the future, so I want to ensure that all of my commands and sub-commands have loaded correctly.
My first thought to do this was to just run
commands = ["config", "othercommand"]
runner = CliRunner()
result = runner.invoke(cli.main)
for command in commands:
assert command in result.output
Run Code Online (Sandbox Code Playgroud)
This has a few pitfalls, from my point …
python ×10
flask ×3
pandas ×2
git ×1
gitpython ×1
mocking ×1
pycharm ×1
pytest ×1
python-2.7 ×1
python-click ×1
restart ×1
sqlalchemy ×1
unit-testing ×1