競プロの解説をPythonでやっていきます。できるだけ初心者に分かりやすいように『やるだけ』とかは言わないようにします。コメントについては必ず読んでいます。どんなに細かいことでもいいのでコメントくださればうれしいです。この広告は、90日以上更新していないブログに表示しています。1.0がリリースされました。以下にその変更点を訳してまとめておきます。誤った部分があればご指摘ください。(#2586)コンソールから実行された際、app.runを無視するようになりました。これによって、デバッグを煩わせる振る舞いを無くします。debug.JSONIFY_PRETTYPRINT_REGULARのデフォルトの値をFalseにしました。jsonify()はデバッグモードではデフォルトでインデントで整えられたコンパクトな返り値を返します。static_host_argumentを取るようになり、静的ルートを定義するときの引数hostとしてにそれを渡すようになりました。(#1559)send_file()はUnicodeをattachment_filenameでサポートしました。provide_automatic_optionsをOPTIONSを追加することを無効にするために受け取れるようになりました。appのエンコーダとデコーダを上書きするために追加されました。(#1898)Flask.make_response()が、レスポンスのタイプが正しくない場合TypeErrorをValueErrorを挙げるようになりました。エラーメッセージが、タイプの違いを説明するために分かりやすくなりました。(#2256)アプリケーションによって作成されたルートを出力するためにroutesをCLIコマンドに追加しました。IPアドレスだった場合、警告するようになりました。Chromeのように一部のブラウザでは正しく動作しないからです。(#2282)IPアドレスをセッションのクッキーのドメインとして受け入れるようになりました。factoryのcreate_appやmake_appを自動検出するようになりました。(#2297)flaskコマンドで実行する際、factory関数にscript_infoパラメータを与えなくてもよくなりました。一つのパラメータ、あるいは、script_infoというパラメータを取る際、ScriptInfoオブジェクトが渡されます。factoryに渡せるようになりました。-eは未だ最適ですが、FLASK_APPは可編集モードでインストールされていないローカルなパッケージを指定できるようになりました。(#2414)Viewクラスのアトリビュートのprovide_automatic_optionsはadd_url_rule()で検出されるようにas_view()に設定されるようになりました。exceptionに登録されたハンドラを試すようになりました。Varyヘッダーに追加されるようになりました。(#2288)test_request_context()が引数subdomainとurl_schemeをベースURLを作成する際に受け取れるようになりました。(#1621)APPLICATION_ROOTに'/'をデフォルトで設定するようになりました。これは、APPLICATION_ROOTをNoneに設定していた時に暗黙的に行われていたことです。None.TRAP_BAD_REQUEST_ERRORSがデフォルトでデバッグモード中に有効になりました。代わりにBadRequestKeyErrorが正しくないキーとともにメッセージを持つようになりました。(#2348)セッションクッキー内に異なる型を保存するためにTaggedJSONSerializerとともに新しいタグを登録できるようになりました。(#2352)リクエストがスタック文脈にプッシュされていない場合のみにセッションが開かれるようになりました。viewを使った同じセッションにstream_with_context()ジェネレータを使ってアクセスすることが可能になりました。jsonキーワードの引数を追加しました。これにより、与えられたオブジェクトをJSONとしてダンプして、適切なコンテントタイプを充てることができるようになります。(#2358)RequestとResponseクラスの両方に登録されたmix-inにJSONハンドルを抽出します。これは、JSONレスポンスのテストを非常に簡単にするために、レスポンスにis_json()メソッドとget_json()メソッドを追加します。(#2358)エラー処理のキャッシュを無くしました。それがエクセプション継承の階層に予期できない結果をもたらすからです。MROをトラバースしたくなければ、各エラーにハンドラを明示的に登録してください。(#2374)jinja_envが既にアクセスされていても、テンプレート自動再読み込みはデバッグモードを優先するようになりました。(#2373)以下の非推奨のコードが削除されました。flask.ext名前空間を通す代わりに拡張機能をじかに名前でインポートします。flask_alchemyになります。Flask.error_handler_specを追跡に使用し、Flask.errorhandler()をハンドラの登録に使用してください。Flask.app_ctx_globals_classを代わりに使用してください。Flask.static_url_pathを代わりに使用してください。Request.blueprintを代わりに使用してください。instead.Request.jsonプロパティが非推奨ではなくなりました。(#1421)EnvironBuilderかDictをtest_client.openに渡すことがサポートされました。(#2412)python-dotenvがインストールされていた場合、flaskコマンドとFlask.run()は環境変数を.envと.flaskenvから読み込むようになりました。(#2416)テストクライアントにフルURLを渡すとき、スキーム内のURLがPREFERRED_URL_SCHEMEの代わりに渡されるようになりました。(#2430)Flask.loggerがシンプルになりました。LOGGER_HANDLER_POLICYのコンフィグが削除されました。ロガーの名前は常にflask.appになりました。ロガーの名前は常にflask.appです。レベルは最初のアクセス時にのみ設定され、毎回Flask.debugをチェックすることはしません。Flask.debugに依存するものではなく、使用されるフォーマットは1つだけです。ハンドラは削除されておらず、ハンドラがすでに設定されていない場合にのみハンドラが追加されます。view関数の名前はドットを含まなくなりました。(#2450)いくつかの場合で誤ったRangeのリクエストにより起きるValueErrorが修正されました。(#2526)開発用サーバーがデフォルトでスレッディングを行うようになりました。(#2529)silent=Trueでコンフィグを読み込んだ時、ENOTDIRエラーが無視されるようになりました。runに渡すことで、開発用サーバがHTTPSを使用して実行するようになりました。(#2606)セッションクッキーのSameSite属性を操作するために、SESSION_COOKIE_SAMESITEを追加しました。CLIコマンドを呼び出すためのクリックランナーを作成するためにtest_cli_runner()を追加しました。(#2636)サブドメインマッチングがデフォルトで無効にされ、SERVER_NAMEを設定することが暗黙的にサブドメインマッチングを有効にすることがなくなりました。有効にするには、Flaskコンストラクタにsubdomain_matching=Trueを渡してください。(#2635)blueprintのurl_prefixがappに登録されたとき、末尾に単独のスラッシュがあった場合、それを取り除くようになりました。時、Request.get_json()が解析に失敗した場合、結果をキャッシュしなくなりました。(#2651)Request.get_json()は任意のエンコーディングをサポートしなくなりました。8259準拠のものが推奨されます。-32を自動で判別します。(#2691)ブラウザが無視してしまうような巨大なクッキーについてWerkzeugが警告したときのため、それらをコントロールするためMAX_COOKIE_SIZEとResponse.max_cookie_sizeを追加しました。(#2693)小さいウィンドウでも見やすいよう、ドキュメンテーションのテーマを更新しました。(#2709)新しいユーザを落とし穴から守るため、チュートリアルと例として挙げるプロジェクトをより構造化されたアプローチに変更しました。Python以前、”国会にhash関数の話が出たwww”といって、そっちの界隈の人でちょっとした話題になっていました。hashとはなんなのか?分からない人もいると思います。それがわかっても、Pythonでの実装がわからない方もいらっしゃると思いますので、この記事を書いた次第です。hashって?wikipediaを参照するとデータから算出した小さな値。各データを区別・表現する目的に用いる。あるデータから、それ固有の値を取り出して(計算から導き出す)、データの区別に使うための値。この計算というのが大事で、たとえば、長さが400ページ以上もある本を文字に落とし込んで所得したhashと、その文字列の句点と読点を一個だけ入れ替えた文字列のhashは異なります。そこから、文書の改ざん対策などにも用いられるんですね。その『元からhashを求めるのは用意である』が『hashから元を求めるのは非常に困難である』という性質を利用して、暗号・セキュリティにも用いられています。Pythonで実装Pythonにはhash関数が元からありますので、それを利用してみましょう。dictなど)は用いないでください4940519975841726253求められましたね。これではだめですこのhashが信頼できるのは、このインタープリタを閉じるまでだからです。一度閉じて、もう一度実行してみましょう。hash("1")2261270426266027010おなじ文字列のhashを取り出したにもかかわらず、違う値が出ていますよね。このように、正当性を確かめるには、標準のhashは不向きであるとわかります。同じ値が返ってきますみなさんが同じコードを打っても、同じ値が返ってくるはずです。これが、一意性を保っているということです。MD5(hash化の方法の種類です)のほかに、SHA1、SHA224、SHA256、SHA384、SHA512が対応しているようです。ユーザーのパスワードをhash化して持っておき、ログインしようとしたときに、そのhashと入力された文字列のhashを比べる、なんてこともできますよね。MD5に関しては、衝突(別のデータが同じhash値を持つ)ことが他のものと比べて多いようなので、注意ですしかし、まだまだパスワードは軟弱で、Brute-Force-Attack(総当たり攻撃)に対抗するだけの力がありません。Salt(パスワードと関係のない値)と反復を繰り返すのがhashlib.pbkdf2_hmac()です。得られたhashb'53ce88a1559e955b7b68794225365af09261f0a411629cef554de208e33e8da7'といった感じです。10,000回以上回すことが推奨されています。QiitaをPythonで解いてみました。ある程度難しい問題があるので、説明を端折ることもあると思いますが、できるだけわかりやすく説明します。高橋君はデータの加工が行いたいです。