我从http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world上了解了我的Flask项目的布局.
我有以下结构:
app/
__init__.py
views.py
forms.py
myFile.py
run.py
config.py
Run Code Online (Sandbox Code Playgroud)
在views.py,forms.py我能够使用
from config import basedir
Run Code Online (Sandbox Code Playgroud)
但是我不能在myFile.py中使用它
我补充道
import Flask
Run Code Online (Sandbox Code Playgroud)
当我修改它时,Flask Web服务器重新启动,但它没有说app/myFile.py中发现的更改重新启动它只是重新启动.
我需要做什么才能使用
from config import basedir
Run Code Online (Sandbox Code Playgroud)
在我的python文件中.__init__.py对于forms.py,我没有看到任何特殊内容.
编辑:这是我的__init__.py文件:
from flask import Flask
from config import basedir
app = Flask(__name__)
app.config.from_object('config')
from app import views
Run Code Online (Sandbox Code Playgroud) 我希望能够"向上箭头"到我在之前的Python解释器中输入的命令.我发现readline它提供了类似的功能模块:read_history_file,write_history_file,和set_startup_hook.虽然我还不够精明,但有人可以帮忙吗?我对解决方案的看法是:
(1)修改.login PYTHONSTARTUP以运行python脚本.(2)在那个python脚本文件中执行以下操作:
def command_history_hook():
import readline
readline.read_history_file('.python_history')
command_history_hook()
Run Code Online (Sandbox Code Playgroud)
(3)每当解释器退出时,将历史记录写入文件.我想最好的方法是在你的启动脚本中定义一个函数并使用该函数退出:
def ex():
import readline
readline.write_history_file('.python_history')
exit()
Run Code Online (Sandbox Code Playgroud)
不过要用括号退出是非常烦人的:ex().是否有一些python糖允许ex(没有parens)运行该ex功能?
是否有更好的方法可以使历史文件每次都写入?提前感谢所有解决方案/建议.
此外,我可以看到有两种架构选择.一种选择是拥有统一的命令历史记录.好处是简单(后面窝你的home目录有很多文件的替代品.)的缺点是,你在不同的终端上运行口译将与对方的命令历史记录进行填充,它们将覆盖彼此的历史.(因为我通常是在关闭一个解释,并立即重新打开一个重新加载模块感兴趣,在这种情况下,这个解释器中的命令将被写入文件,这是没有问题啊.)一个可能的解决方案,以保持每个终端独立的历史文件是为您创建的每个新终端编写环境变量:
def random_key()
''.join([choice(string.uppercase + string.digits) for i in range(16)])
def command_history_hook():
import readline
key = get_env_variable('command_history_key')
if key:
readline.read_history_file('.python_history_{0}'.format(key))
else:
set_env_variable('command_history_key', random_key())
def ex():
import readline
key = get_env_variable('command_history_key')
if not key:
set_env_variable('command_history_key', random_key())
readline.write_history_file('.python_history_{0}'.format(key))
exit()
Run Code Online (Sandbox Code Playgroud)
通过将随机密钥长度从16减少到1,您可以将丢失目录的文件数减少到36,但代价是可能的重叠(2.8%).
我想知道是否有可能防止向数据库提交重复项。例如,假设有一个类如下
class Employee(Base):
id = Column(Integer, primary_key=True)
name = Column(String)
Run Code Online (Sandbox Code Playgroud)
如果我要制作一系列这些物品,
employee1 = Employee(name='bob')
employee2 = Employee(name='bob')
session.add_all([employee1, employee2])
session.commit()
Run Code Online (Sandbox Code Playgroud)
我想只添加单个行到数据库中,并employee1与employee2以指向同一个对象在内存中(如果可能)。
SQLAlchemy 中是否有实现此目的的功能?或者我是否需要以编程方式确保重复项不存在?
我有一个辅助函数,可以将一个%Y-%m-%d %H:%M:%S-formatted 字符串转换为一个datetime.datetime:
def ymdt_to_datetime(ymdt: str) -> datetime.datetime:
return datetime.datetime.strptime(ymdt, '%Y-%m-%d %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)
我可以ymdt在函数本身中验证格式,但是将自定义对象用作参数的类型提示会更有用,例如
from typing import NewType, Pattern
ymdt_pattern = '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]'
YmdString = NewType('YmdString', Pattern[ymdt_pattern])
def ymdt_to_datetime(ymdt: YmdString)...
Run Code Online (Sandbox Code Playgroud)
我是不是走错了兔子洞?这应该是mypy某个地方或某个地方的问题吗?或者这可以通过当前的类型提示实现(3.61)来完成吗?