Python×医療事務(×トロント)

#医療 / #医療事務 / #IT / #トロント / #歯科助手 / #のんびり / #備忘録 / #趣味

FLASK  公式チュートリアルにて簡易アプリ

プロジェクトのレイアウト — Flask Documentation (1.1.x)

最終的なプロジェクトのレイアウト

/home/user/Projects/flask-tutorial
├── flaskr/

flaskr/、アプリケーションのコードとファイルを含んだPythonのpackage。

│   ├── __init__.py
│   ├── db.py
│   ├── schema.sql
│   ├── auth.py
│   ├── blog.py
│   ├── templates/
│   │   ├── base.html
│   │   ├── auth/
│   │   │   ├── login.html
│   │   │   └── register.html
│   │   └── blog/
│   │       ├── create.html
│   │       ├── index.html
│   │       └── update.html
│   └── static/
│       └── style.css
├── tests/
tests/、テスト用moduleを含んだディレクトリ。
│   ├── conftest.py
│   ├── data.sql
│   ├── test_factory.py
│   ├── test_db.py
│   ├── test_auth.py
│   └── test_blog.py
├── venv/
venv/、Flaskとその他の依存対象がインストールされたPythonの仮想環境。
├── setup.py
└── MANIFEST.in
 

FlaskアプリケーションはFlaskクラスのインスタンス

flaskrディレクトリを作成し

mkdir flaskr

__init__.pyファイルを追加

import os

from flask import Flask


def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    if test_config is None:
        # load the instance config, if it exists, when not testing
        app.config.from_pyfile('config.py', silent=True)
    else:
        # load the test config if passed in
        app.config.from_mapping(test_config)

    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # a simple page that says hello
    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    return app

__init__.pyの役割=application factoryを含むことと、Pythonflaskrディレクトリをpackageとして扱うように伝えること

 

flask-tutorialディレクトリにいる状態

<flaskrにいると下記エラー出る>

* Serving Flask app 'flaskr' (lazy loading)
* Environment: development
* Debug mode: on
Usage: flask run [OPTIONS]


Error: Could not import 'flaskr.flaskr'.

python - flask.cli.NoAppException: Could not import "flaskr.flaskr" - Stack Overflow

開発モードにする

(ページが例外を起こしたときにはインタラクティブなデバッガを表示し、コードを変更したときにはサーバを再起動

Flaskを実行させたままにしながら、ブラウザのページを再読み込みするだけで済むようにする)

LinuxおよびMac向け:

export FLASK_APP=flaskr

export FLASK_ENV=development

 

* Serving Flask app "flaskr" (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with fsevents reloader
* Debugger is active!
* Debugger PIN: 178-620-284

 

⚠エラー

Import "flask" could not be resolved from source

f:id:chocolate22554:20210811190711p:plain

Stack Overflow有能

python - import flask could not be resolved from source pylance - Stack Overflow

下記のURLでしたら出来た 解決

▶ https://techinscribed.com/python-virtual-environment-in-vscode/

venveで作ったが そもそもanacondaで仮想環境 作っているのに python conda内にpathを通さず?(conda内のを使っておらず) そのためにエラーが出てた模様

f:id:chocolate22554:20210811201321p:plain

データベースへの接続

データベースの定義とアクセス — Flask Documentation (1.1.x)

ユーザ情報と投稿記事を格納するためにSQLiteデータベースを使用していきます。Pythonでは、組み込みのSQLiteサポートのsqlite3モジュールが一緒に提供されています。▶電子カルテ 等の患者データ(ID、(名前)、年齢(生年月日)、)

SQL言語

データベースへの接続(connection)の作成です。どのような問合せ(queries)や操作(operations)も、connectionを使用しながら実施され、作業が終了した後はconnectionが閉じられ(close)ます。

 

connectionは典型的にはリクエストと結び付け

リクエスト処理中のどこかの時点で作成され、レスポンスが送信される前に閉じられます。

 webアプリケーションでは、connectionは典型的にはリクエストと結び付けられる

 

アプリケーションへの登録

init-dbコマンドを実行:

 flask init-db

Initialized the database.

⚠エラー:AttributeError: 'ellipsis' object has no attribute 'teardown_appcontext'

createが2つあることが原因だった

python - Flask tutorial: AttributeError teardown_appcontext - Stack Overflow

import os
##Flaskとrender_template(HTMLを表示させるための関数)をインポート
from flask import Flask,render_template,request

#create_appはapplication factoryの関数
def create_app(test_config=None):
##def index():
# create and configure the app
#Flaskインスタンスを作成 __name__=Pythonのmodule名
#appは、いくつかpathを用意するために、appがどの場所にあるか知る必要があり、
# __name__はそれを伝えるための便利なやり方
app = Flask(__name__, instance_relative_config=True)
#configuration (設定)filesがインスタンスフォルダから相対的に示されることを、appへ伝え
#インスタンスフォルダはflaskrパッケージの外側に位置し、秘密情報の設定やデータベースのファイルなど、
# バージョン管理へコミットするべきではないローカルのデータを保持することができます。
##name = request.args.get("name")
## ll = Content.query.all()
app.config.from_mapping(
#appが使用する標準設定をいくつか設定
SECRET_KEY='dev',
#データを安全に保つため
#無作為な値(random value)で上書きするべき
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
#SQLiteデータベースファイルが保存されるパス
#インスタンスフォルダに選んだパスである、app.instance_pathの下
)
##return render_template("index.html",name=name,ll=ll)
if test_config is None:
# load the instance config, if it exists, when not testing
app.config.from_pyfile('config.py', silent=True)
#インスタンスフォルダにconfig.pyファイルがあれば、値をそこから取り出して、標準設定を上書き
else:
# load the test config if passed in
app.config.from_mapping(test_config)

# ensure the instance folder exists
try:
os.makedirs(app.instance_path)
#app.instance_pathが確実に存在するようにします
#Flaskはインスタンスフォルダを自動的には作成しませんが、
#SQLiteデータベースファイルを作成するためにインスタンスフォルダが作成されている必要
except OSError:
pass

# a simple page that says hello
##########@app.route('/hello')
#アプリケーションが機能していることを確かめるための簡易な経路(route)を作成

@app.route("/hello")
#@app.route("/index",methods=["post"])
def hello():
#def post():
return 'Hello, World!'

#return app
##おまじない
##if __name__ == "__main__":
##app.run(debug=True)

#def create_app():
# app = ...
# existing code omitted

from . import db
db.init_app(app)

return app

instanceフォルダにflaskr.sqliteファイルが出来た

 

Blueprints and Views

アプリケーションへのリクエストに対して応答するために書くコード

受信する(incoming)リクエストのURLを、それを処理すべきviewへと照合するためにパターンを使用

Blueprintは、関連するviewおよびその他のコードをグループへと編成する方法

Flaskの代わりにそれらをblueprintに登録

 Flaskアプリケーションが利用可能になったときに、blueprintをFlaskアプリケーションに登録

アプリケーションの認証のview 

 

テンプレート

 ユーザのブラウザに表示するHTMLへ変換(render)するためにテンプレートを使用

jinja  {{}}の間のすべてのものが、最終ドキュメントへ出力される式(expression)

{%%}は、ifforのような制御フロー文

 コメントはこれらしい→   {# a comment #}

Template Designer Documentation — Jinja Documentation (3.0.x)

htmlのコメントアウトはjinjaエラー出るのでjinjaのコメントアウト使う

 

{% extends 'base.html' %}
<!--
ベースのテンプレートからブロックを置き換えるものだということをJinjaへ伝えます
表示される全てのcontentは、ベースのテンプレートのブロックを上書きする、
{% block %}タグの内側で現れる必要があります -->
 

 

<input name="username" id="username" required>
<!--ここではrequired属性を使用
ブラウザに、それらの入力欄が記入されないうちは、formを提出(submit)しないように伝える -->

 

 

 

 blueprintのテンプレートは(templatesの下の)blueprintと同じ名前のディレクトリに置かれます。

 

 

 

環境の作成

プロジェクトのフォルダと、その中のvenvフォルダを作成します。

flask- tutorialにて

$ python3 -m venv venv

 

. venv/bin/activate

 

 

http://127.0.0.1:5000/→和訳だとhttpsになっているためつながらない

 

 

 

インストール可能なプロジェクト(Make the Project Installable)

 

その他のデータが何かを伝えるためには、PythonMANIFEST.inというもう一つのファイルを必要

MANIFEST.in
include flaskr/schema.sql
graft flaskr/static
graft flaskr/templates
global-exclude *.pyc

これはPythonに、statictemplatesディレクトリにある全てと、schema.sqlファイルはコピーし、バイトコードのファイル(訳注:Pythonが実行時に作成・使用する中間ファイル)は除外するように伝えます。

 

 

 

出来た!

なんだかんだ公式チュートリアル?が楽でした

そして英訳のほうがわかりやすい

f:id:chocolate22554:20210816204121p:plain


 次は、D-jango

 

=その他諸々===========================

⚠エラー

Import "flask" could not be resolved from source で調べた結果

【VSCode】importで未解決の警告(import ~ could not be resolved)が出る問題の対策方法 - aburi6800のブログ

公式ドキュメントからコピったのを貼る

{
"python.analysis.extraPaths": ["./sources"]
}

 

f:id:chocolate22554:20210811191030p:plain



VSCodeを再起動する。

 

python — Requirements.txtを自動的に作成する

pip install pipreqs

Collecting pipreqs
Downloading pipreqs-0.4.10-py2.py3-none-any.whl (25 kB)
Collecting yarg
Downloading yarg-0.1.9-py2.py3-none-any.whl (19 kB)
Collecting docopt
Downloading docopt-0.6.2.tar.gz (25 kB)
Requirement already satisfied: requests in /Users/○○/opt/anaconda3/lib/python3.8/site-packages (from yarg->pipreqs) (2.24.0)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /Users/○○/opt/anaconda3/lib/python3.8/site-packages (from requests->yarg->pipreqs) (1.25.11)
Requirement already satisfied: certifi>=2017.4.17 in /Users/○○/opt/anaconda3/lib/python3.8/site-packages (from requests->yarg->pipreqs) (2020.6.20)
Requirement already satisfied: idna<3,>=2.5 in /Users/○○/opt/anaconda3/lib/python3.8/site-packages (from requests->yarg->pipreqs) (2.10)
Requirement already satisfied: chardet<4,>=3.0.2 in /Users/○○/opt/anaconda3/lib/python3.8/site-packages (from requests->yarg->pipreqs) (3.0.4)
Building wheels for collected packages: docopt
Building wheel for docopt (setup.py) ... done
Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13704 sha256=9a1e75afe94a607297cb47b12f4004c8caf9c89b4c94b3f041f1c7155afe3dd1
Stored in directory: /Users/○○/Library/Caches/pip/wheels/56/ea/58/ead137b087d9e326852a851351d1debf4ada529b6ac0ec4e8c
Successfully built docopt
Installing collected packages: yarg, docopt, pipreqs
Successfully installed docopt-0.6.2 pipreqs-0.4.10 yarg-0.1.9

python — Flask.cli.NoAppException:アプリケーションがクラッシュする

pip3 install -r requirements.txt --ignore-installed

 

WARNING: You are using pip version 20.1.1; however, version 21.2.3 is available.
You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8 -m pip install --upgrade pip' command.

cd で移動

cd '/Library/Frameworks/Python.framework/Versions/3.8/bin/

pip install --upgrade pip  でアップグレード

 

◎更新

pip install -U sqlalchemy

Requirement already satisfied: sqlalchemy in /Users/◎◎/opt/anaconda3/lib/python3.8/site-packages (1.3.20)
Collecting sqlalchemy
Downloading SQLAlchemy-1.4.22-cp38-cp38-macosx_10_14_x86_64.whl (1.5 MB)
|████████████████████████████████| 1.5 MB 134 kB/s
Collecting greenlet!=0.4.17
Downloading greenlet-1.1.1-cp38-cp38-macosx_10_14_x86_64.whl (87 kB)
|████████████████████████████████| 87 kB 160 kB/s
Installing collected packages: greenlet, sqlalchemy
Attempting uninstall: greenlet
Found existing installation: greenlet 0.4.17
Uninstalling greenlet-0.4.17:
Successfully uninstalled greenlet-0.4.17
Attempting uninstall: sqlalchemy
Found existing installation: SQLAlchemy 1.3.20
Uninstalling SQLAlchemy-1.3.20:
Successfully uninstalled SQLAlchemy-1.3.20
Successfully installed greenlet-1.1.1 sqlalchemy-1.4.22