[[ノート>ノート/ノート]]~
訪問者数 &counter();      最終更新 &lastmod();

ディレクトリbubbleを作る
 python3 -m venv bubble
 cd bubble
 source bin/activate

[[flask:http://flask.pocoo.org/]]([[Docs:http://flask.pocoo.org/docs/1.0/]])で必要なソフトをインストールする。
--[[オリジナルのチュートリアルの訳:https://a2c.bitbucket.io/flask/tutorial/index.html]]
--この[[チュートリアル:https://study-flask.readthedocs.io/ja/latest/]]に沿ってゆく(loginチェック付き)
--その他に [[Flaskチュートリアル - Pythonでツイッターの分析ツールを作ってディプロイしよう!(動画つき!):https://note.mu/daikawai/n/n233ef9662323]]

 pip install flask
 pip install flask-sqlalchemy  flask-sqlalchemyとSQLAlchemyが入るらしい
 flask-login?
 
その他に参考: [[Flask-Loginの使い方:https://qiita.com/msrks/items/d9c327dd81749ec01d1d]]


[[デプロイ:https://study-flask.readthedocs.io/ja/latest/05.html]]用に[[uwsgiをインストール:https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html]]する
 pip install uwsgi


Flaskのためのファイルとディレクトリを作る
 manage.py
 requirements.txt
 bubble/
   |- __init__.py
   |- config.py
   |- views.py
   |- models.py
   |- static/
       |- style.css
   |- templates/
       |- layout.html
       |- show_entries.html

config.py中に、
 SQLALCHEMY_DATABASE_URI = 'sqlite:///flaskr.db'
 SECRET_KEY = b'------------'
 SQLALCHEMY_TRACK_MODIFICATIONS = True
:q!
を置くが、SECRET_KEYは
 >>> import os
 >>> os.urandom(24)
で生成するとよいと書いてある。

models.pyでclass Entryとinit()を作ったところで、データベースを作ってしまう。
 >>> from flaskr.models import init
 >>> init()

faviconを追加するにはviews.pyの中で、
 @app.route('/fabicon.ico')
 def favicon():
     return send_from_directory(os.path.join(app.root_path, 'static'),
                                'favicon.ico', mimetype='image/vnd.microsoft.icon')
とともに、templates/layout.html中に
 <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
を追加する。

flask単体で起動するには、bubble中で
 python manage.py
とする。またuwsgi経由で起動するには、
 uwsgi --http :5000 --wsgi-file manage.py --callable app
とする。これをコマンドスクリプトとして作っておくとよい。

Bootstrapを使いたいので、staticの下にbootstrap-4.1.3-dist.zipを展開、css, jsの2つのディレクトリができる。Bootstrapの読み出しは、templates/layout.htmlの中で行う。
 <!doctype html>
 <html lang="ja">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <title>BubbleCharts</title>
     <link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
     <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
     <!-- Bootstrap -->
     <link href="/static/css/bootstrap.min.css" rel="stylesheet">
 
     <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
     <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
     <!--[if lt IE 9]>
       <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
       <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
     <![endif]-->
   </head>
   <body>
     {% block content %}{% endblock %}
     <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
     <script src="/static/js/jquery.min.js"></script>
     <!-- Include all compiled plugins (below), or include individual files as needed -->
     <script src="/static/js/bootstrap.min.js"></script>
 
 <div class=page>
   <h1>BubbleCharts</h1>
   <div class="container">
     <div class="row">
       <div class="col-md-6"> これは </div>
       <div class="col-md-6"> 困った6 </div>
     </div>
   </div>
   {% for message in get_flashed_messages() %}
     <div class=flash>{{ message }}</div>
   {% endfor %}
   {% block body %}{% endblock %}
 </div>
 
   </body>
 </html>

--------------------------------
イメージを出力する

イメージをブラウザに出力するにはいくつかのやり方があるらしい([[Flaskでファイルダウンロードを実現する3つの方法:https://qiita.com/5zm/items/760000cf63b176be544c#2-%E6%96%B9%E6%B3%95%EF%BC%91send_file%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B]]。

実際にやってみると、次の通り。
-flask.send_file(f) [[API:http://flask.pocoo.org/docs/1.0/api/]] はfがファイル名かファイルハンドルでなければならない。io.BytesIOで作ったオブジェクトをくべると不可。ストリング(io.BytesIOの結果に対して.getvalue())でも不可。[[Python Flask mongoDB上の画像をhtmlで表示する:http://ikapblg.blog.fc2.com/blog-entry-140.html]]にあるような
 bi = BytesIO(item.image.read())
 return send_file(bi, mimetype='image/jpeg')
もダメみたい。

-文字列ベースで作って返すのでも不可。([[PythonのFlaskでのrender_templateで画像ファイルの表示方法:https://teratail.com/questions/89341]])

-うまくいったのが、make_response() [[API:http://flask.pocoo.org/docs/1.0/api/]] を使う方法。
 @app.route('/image')
 def myimage():
     plt.plot([1, 2, 3])
     buf = io.BytesIO()
     plt.savefig(buf, format='png')
     buf.seek(0)
     response = make_response()
     response.data = buf.getvalue()
     response.mimetype = 'image/png'
     return(response)


-------------------

[[Python Flask Javascriptで変数の受け渡し:http://mycodingjp.blogspot.com/2018/11/python-flask-javascript.html]]

-------------------

[[初心者の決定版アプリ: Flask と SQLite で TODO アプリを作る!:https://www.superbusinessman.biz/todo-app-using-flask-and-sqlite/]]

ちなみに、プログラムbubbleでのSQLite周りのテストプログラムとして、こんなものを用意した。
 # -*- coding: utf-8 -*-
 from flask import Flask
 from flask_sqlalchemy import SQLAlchemy
 from bubble import app, db
 from bubble.models import Entry, User
 
 app = Flask(__name__)
 app.config.from_object('bubble.config')
 
 db = SQLAlchemy(app)
 
 users = User.query.all()
 print(users, User._get_password(users[0]))

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS