Flask の紹介
Flask は、Django と比較して軽量な Webフレームワークです。
Django とは異なり、Flask は一連のオープン ソース ソフトウェア パッケージに基づいて構築されており、その中で最も重要なものは WSGI アプリケーション開発ライブラリ Werkzeug と テンプレート エンジンですJinja:
戦略: werkzeug と Jinja ライブラリは Flask と同様に、 pocooチームによって開発されました。これは、Django と競合する際の Pocoo の環境戦略を反映している可能性があります。この戦略の自然な拡張として、Flask フレームワークには、ORM であろうとその他であろうと、データベース コンポーネントが含まれていません。
焦点: Flask は WSGI アプリケーション フレームワークです。つまり、Flask を開発するときにネットワーク操作に注意を払う必要はありません。Flask アプリケーションの入口はカプセル化されたネットワーク要求パケットであり、出口はネットワーク応答です。このステージ内の処理ロジックにのみ注意する必要があります。
WSGIサーバー: Flaskにはシンプルな組み込みWSGIサーバーがありますが、そのパフォーマンスは開発期間中のデバッグにのみ適しています。 Flask 公式 Web サイトでは、マルチプロセスからマルチスレッド、コルーチンに至るまでの実装方法を備えたさまざまな WSGI サーバーを推奨していますが、このコースではこの選択については説明しません。
REST への適応性: Flask と Django は同じですが、最初の出発点はサーバー側の動的 Web アプリケーションです。ただし、Flask の設計はリソース指向の REST アーキテクチャに非常に適しており、シングルページ アプリケーションがますますモバイル化され重要になっている WEB 開発の分野では、これが Django に対する Flask の大きな利点です。 Hello Flask
Flask に基づいて Hello World を記述するのは非常に簡単です:
1. Flask クラスをインポートします
from flask import Flask
2. Flask インスタンスを作成します
app = Flask(name)
の最初のパラメーターは、インポート名/importname を指定します。 Flask フレームワークは、この名前を使用して static リソース、テンプレート、エラー メッセージを見つけます。その目的を明確に理解していない限り、通常は常に特別な変数 _name を使用する必要があります。 Flask インスタンスは呼び出し可能 (call メソッドを持つ) であり、このインスタンスは WSGI サーバーに直接接続できます。
3. ルーティングの登録
@route('/') def index(): return 'Hello,Flask!'
ルーティングの登録は、URL ルールと処理関数の間の関連付けを確立することです。 Flask フレームワークは、ルーティングに依存して HTTP リクエストの配布を完了します。
ルート内の関数はビュー関数と呼ばれ、その戻り値がHTTPレスポンスのボディ内容として使用されます。
4. WSGI サーバーに接続して起動します
その名前が示すように、ルーティングとは混乱から抜け出す方法を見つけることを意味します。 Flask フレームワークでは、ルーティングとは、ユーザーが要求した URL に対応する処理関数を見つけることを意味します。
このコースでは、主に次の側面から Flask フレームワークにおけるルーティングについて説明します:
アプリケーションのルーティングを登録するには? サポートする HTTP メソッドをルートに指定するにはどうすればよいですか? 動的 URL を照合するにはどうすればよいですか? URL内の変数タイプをフィルタリングするにはどうすればよいですか? アクセスポイント/エンドポイントを理解するにはどうすればよいですか? アプリケーションに静的ルーティングを設定するにはどうすればよいですか? 他のビューを指す URL のハードコーディングを回避するにはどうすればよいですか? ルートの登録
Flask アプリケーションでは、ルーティングとは、ユーザーがリクエストした URL とビュー関数の間のマッピングを指します。 Flask フレームワークは、HTTP リクエストの URL に従ってルーティング テーブル内の事前定義された URL ルールと照合し、対応するビュー関数を見つけて、ビュー関数の実行結果を WSGI サーバーに返します。ルーティング テーブルが Flask アプリケーションの位置の中心にあること。ルーティング テーブルの内容は、アプリケーション開発者によって設定されます。
ルート デコレータ: Flask アプリケーション インスタンスのルート デコレータを使用して、URL ルールをビュー関数にバインドできます。
たとえば、次の例では、URL ルール /test をビュー関数 test() にバインドします:
app.run(host='0.0.0.0',port=80)
http :// pythontab.com/teset
Flask フレームワークは test() 関数を呼び出し、その戻り結果が WSGI サーバーに渡されて訪問者に送信されます。
add_url_rule(): もう 1 つの同等の記述方法は、Flask アプリケーション インスタンスの add_url_route() メソッドを使用することです。 次の例では、前の例と同じルートを登録します。@app.route('/test') def test(): return 'this is response'
默认情况下,Flask路由仅支持HTTP的GET请求。可以使用methods关键字参数,在注册 路由时显式地声明视图方法支持的HTTP方法。
例如,下面的示例将URL规则/auth绑定到视图函数v_auth(),这个路由仅支持POST方法:
@app.route('/auth',methods=['POST']) def v_auth():pass
关键字参数methods的类型为list,因此可以同时指定多种HTTP方法。
下面的示例中,使URL规则/user同时支持POST方法和GET方法:
@app.route('/user',methods=['POST','GET']) def v_users(): if request.method == 'GET': return ... # 返回用户列表 if request.method == 'POST' return ... #创建新用户
这个特性使Flask非常易于开发REST架构的后台服务,而不仅仅局限于传统的动态网页。
有时我们需要将同一类URL映射到同一个视图函数处理,比如,使用同一个视图函数 来显示不同用户的个人档案。我们希望以下的URL都可以分发到同一个视图函数:
在Flask中,可以将URL中的可变部分使用一对小括号<>声明为变量, 并为视图函数声明同名的参数:
@app.route('/user/') def v_user(uname): return '%s\'s Profile' % uname
在上面的示例中,URL规则中的
考虑下面的示例,我们希望通过HTTP共享文件夹/var/readonly中的文件:
/var
/readonly
/a.txt
/b.txt
/repo
/c.txt
/d.txt
简单思考一下就有答案了。我们可以构造URL规则/file/
@app.route('/file/') def v_file(fname): fullname = os.path.join('/var/readonly',fname) f = open(fullname) cnt = f.read() f.close() return cnt
测试结果表明,/file/a.txt和/file/b.txt都没有问题,但是/file/repo/c.txt和 /file/repo/d.txt却会失败。
这是因为,默认情况下,在URL规则中的变量被视为不包含/的字符串。/file/repo/c.txt 是没有办法匹配URL规则/file/
可以使用内置的path转换器告诉Flask框架改变这一默认行为。path转换器允许 规则匹配包含/的字符串:
@app.route('/file/')
在Flask中,转换器/converter用来对从URL中提取的变量进行预处理,这个过程 发生在调用视图函数之前。Flask预置了四种转换器:
string - 匹配不包含/的字符串,这是默认的转换器
path - 匹配包含/的字符串
int - 只有当URL中的变量是整型值时才匹配,并将变量转换为整型
float - 只有当URL中的变量是浮点值时才匹配,并将变量转换为浮点型
我们一直强调,路由的作用是根据请求的URL,找到对应的视图函数。这没错,但是在 Flask框架中,请求任务的分发并不是直接从用户请求的URL一步定位到视图函数, 两者之间隔着一个访问点/endpoint。
以下面的代码为例,我们看Flask怎样实现请求的分发:
@app.route('/home') def home():pass
在Flask内部使用两张表维护路由:
url_map :维护URL规则和endpoint的映射
view_functions :维护endpoint和视图函数的映射。
以用户访问URL/home为例,Flask将首先利用url_map找到所请求URL对应的 endpoint,即访问点home,然后再利用view_functions表查找home这个访问点 对应的视图函数,最终匹配到函数home():
默认访问点 :当我们使用route装饰器注册路由时,默认使用被装饰函数的 函数名(name)作为访问点,因此,你看到上面的表中,路由中的访问点为home。
自定义访问点 :可以在使用route装饰器或调用add_url_rule()方法注册路由时,使用 endpoint关键字参数改变这一默认行为:
@app.route('/home',endpoint='whocare') def home():pass
此时的两张路由表将变成这样:
当创建应用实例时,Flask将自动添加一条静态目录路由,其访问点 始终被设置为static,URL规则默认被设置为/static,本地路径默认被 设置为应用文件夹下的static子文件夹:
+------------------------------------------------------------+ | url rule | endpoint | view_function | | /static | static | Flask.send_static_file | +------------------------------------------------------------+ 如果你的应用目录如下:
/app
/web.py
/static
/main.css
那么启动应用后就可以通过URL/static/main.css访问static文件夹下的main.css了。
除了访问点被固定为static,静态目录的URL规则和本地目录都是可以根据应用情况进行调整。
改变默认的本地路径 :可以在创建应用对象时使用关键字参数static_folder改变 默认的静态文件夹。例如,你的静态文件都存放在应用下的assets目录下, 那么可以按如下的方式创建应用对象:
app = Flask(name,static_folder='assets') 也可以使用一个绝对路径:
app = Flask(name,static_folder='/var/www/static') 改变默认的本地路径并不会对路由表产生影响。
改变默认的URL规则 : 如果不喜欢静态目录URL/static,也可以在创建应用 对象时使用关键字参数static_url_path换一个别的名字。
下面的示例中,将应用下的assets文件夹注册为静态目录/assets:
app = Flask(name,static_folder='assets',static_url_path='/assets') 当应用运行后,通过URL/assets/main.css就可以访问assets文件夹下的 main.css文件了。
这时的路由表变化为:
+------------------------------------------------------------+ | url | endpoint | view_function | | /assets | static | Flask.send_static_file | +------------------------------------------------------------+
在一个实用的视图中,不可避免地存在指向其他视图的链接。在之前的课程示例中,我们 都是在视图函数中这样硬编码这些链接URL的:
@app.route('/') def v_index(): return 'tech' @app.route('/tech') def v_tech():pass
大部分情况下这种硬编码URL是可以工作的。但如果这个应用被挂在WSGI服务器的一个 子路径下,比如:/app1,那么用户访问URL/tech是不会成功的,这时应当访问/app1/tech 才可以正确地路由到视图函数v_tech()。
我们应当使用访问点让Flask框架帮我们计算链接URL。简单地给url_for()函数传入 一个访问点,它返回将是一个可靠的URL地址:
@app.route('/') def v_index(): print url_for('v_contacts') # /contact return 'see console output!' @app.route('/contact') def v_contacts():pass
添加查询参数 : 使用关键字参数,可以在构造的URL中生成查询串。下面的调用将生成 /contact?
format=json @app.route('/') def v_index(): print url_for('v_contacts',format='json') return '' @app.route('/contact') def v_contacts():pass
添加URL变量 : 如果指定访问点对应的视图函数接收参数,那么关键字参数将生成对应的参数URL。下面的 示例将生成/contact/Julia?format=html:
@app.route('/') def v_index(): print url_for('v_contact',name='Julia',format='html') return '' @app.route('/contact/') def v_contact(name):pass
添加锚点 :使用_anchor关键字可以为生成的URL添加锚点。下面的示例将生成URL /contact#part2
@app.route('/') def v_index(): print url_for('v_contacts',_anchor='part2') @app.route('/contact') def v_contacts():pass
外部URL : 默认情况下,url_for()生成站内URL,可以设置关键字参数_external 为True,生成包含站点地址的外部URL。下面的示例将生成URLhttp://
@app.route('/') def v_index(): print url_for('v_contacts',_external=True) @app.route('/contact') def v_contacts():pass
以上がPython開発WEBフレームワークFlaskの詳しい紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。