2019.5.25
边学边做创建一个具备基本功能的博客应用
今天学习内容:项目布局、应用工厂(Flask()、app.run()、pycharm的大坑)
###############################################################################
项目布局:
初学者需要使用结构化的方法,但flask非常灵活,熟悉后可以跳出这个结构。
使用包来管理代码,把代码分为不同的模块。
忽略文件的基本原则是:不是你自己写的文件就可以忽略。假设使用 git 来进行版本控制,那么使用 .gitignore
来设置应当忽略 的文件, .gitignore
文件应当与下面类似:
venv/
*.pyc __pycache__/
instance/
.pytest_cache/ .coverage htmlcov/
dist/ build/ *.egg-info/
###############################################################################
应用设置:
一个Flask 应用是一个Flask 类的实例。所有东西(配置、URL等)会一起注册。
最简单的创建一个Flask应用是在代码最开始创建一个全局Flask实例。如“hello_flask.py”
在一个函数内部创建Flask实例代替创建全局实例,这个函数叫“应用工厂”,里面会把所有应用相关的配置、注册和其他设置都在函数内部完成,返回到这个应用。
应用工厂:
flaskr
文件夹内添加 __init__.py
文件。 __init__.py
有两个作用:一是包含应用工厂;二是 告诉 Python flaskr
文件夹应当视作为一个包。
分析:
1. app = Flask(__name__,instance_relative_config=True) #创建一个Flask实例:
【class flask.
Flask
(import_name, static_url_path=None, static_folder='static', static_host=None, host_matching=False, subdomain_matching=False, template_folder='templates', instance_path=None, instance_relative_config=False, root_path=None)
flask对象实现了一个WSGI应用程序并充当中心对象。 它传递了应用程序的模块或包的名称。 一旦创建它,它将充当视图功能,URL规则,模板配置等的中央注册表。
包的名称用于解析包内或包含模块的文件夹中的资源,具体取决于package参数是否解析为实际的python包(内部带有__init__.py文件的文件夹)或标准模块( 只是一个.py文件)。
-
第一个参数的想法是让Flask了解属于您的应用程序的内容。 此名称用于查找文件系统上的资源,可以由扩展使用以改进调试信息等等。
所以你在那里提供的很重要。 如果您使用的是单个模块,则__name__始终是正确的值。 但是,如果您使用的是软件包,通常建议在那里对软件包的名称进行硬编码。
例如,如果您的应用程序是在yourrapplication / app.py中定义的,则应使用以下两个版本之一创建它:
app = Flask('yourapplication') app = Flask(__name__.split('.')[0])
这是为什么? 由于查询了资源,应用程序甚至可以使用__name__。 但是它会使调试更加痛苦。 某些扩展可以根据应用程序的导入名称进行假设。 例如,Flask-SQLAlchemy扩展将查找应用程序中以调试模式触发SQL查询的代码。 如果未正确设置导入名称,则该调试信息将丢失。 (例如,它只会在yourapplication.app中获取SQL查询,而不是yourapplication.views.frontend)】
__name__
是当前 Python 模块的名称。应用需要知道在哪里设置路径, 使用__name__
是一个方便的方法。
- instance_relative_config –如果设置为True,则假定加载配置的相对文件名相对于实例路径而不是应用程序根目录。
instance_relative_config=True
告诉应用配置文件是相对于 instance folder 的相对路径。实例文件夹在 flaskr
包的外面,用于存放本地数据(例如配置密钥和数据库),不应当提交到版本控制系统。
2. app.config.from_mapping( SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path,'flaskr.sqlite') , )
设置一个应用的缺省配置:
SECRET_KEY
是被 Flask 和扩展用于保证数据安全的。在开发过程中, 为了方便可以设置为'dev'
,但是在发布的时候应当使用一个随机值来 重载它。DATABASE
SQLite 数据库文件存放在路径。它位于 Flask 用于存放实例的app.instance_path
之内。
3. app.config.from_pyfile('config.py',silent=True)
使用 config.py
中的值来重载缺省配置,如果 config.py
存在的话。 例如,当正式部署的时候,用于设置一个正式的 SECRET_KEY
。
test_config
也会被传递给工厂,并且会替代实例配置。这样可以实现 测试和开发的配置分离,相互独立。
4. os.makedirs(app.instance_path)
可以确保 app.instance_path
存在。 Flask 不会自动 创建实例文件夹,但是必须确保创建这个文件夹,因为 SQLite 数据库文件会被 保存在里面。
5.@app.route()
创建一个简单的路由。它创建了 URL /hello
和一个函数之间 的关联。这个函数会返回一个响应,即一个 'Hello, World!'
字符串。
现在可以通过使用 flask
命令来运行应用。在终端中告诉 Flask 你的应用在哪里, 然后在开发模式下运行应用。
开发模式下,当页面出错的时候会显示一个可以互动的调试器;当你修改代码保存的 时候会重启服务器。
在 Linux and Mac 下:
export FLASK_APP=flaskr
export FLASK_ENV=development
flask run
效果:(不加/hello会404,URL是 http://127.0.0.1:5000/)
为什么是:http://127.0.0.1:5000/
因为:flask默认开启的ip地址是:http://127.0.0.1:5000/
可以改此时需要修改如下:
但是pycharm这里很坑!!!!!!而且flask工程只能用专业版才能建立,这搞死人了,不是flask工程的py文件是没有additional options这一栏的
https://blog.csdn.net/weixin_42359693/article/details/80775511
这个问题弄了我两个小时,原地爆炸了都,下了个专业版试用,然后从configuration里改host和port: