いまさらflask使ってみた

  • いまさらflask使ってみた
  • jinjaは前に使ったことあるので特に問題なし

まとめ

  • flask便利
  • htmlをrendorできた
  • json API作れた
  • file downloadもできた
  • メモアプリとしては未完成…
  • Microな域を超えたらdjangoにしないと消耗しそう
from flask import (
    Flask,
    render_template,
    jsonify,
    request,
    send_from_directory
)
import sys
import datetime
app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/hello_html/<name>')
def hello_html(name=None):
    return 'hello {}'.format(name)


@app.route('/api/save/word', methods=['POST'])
def save_word():
    filename = 'save.tsv'
    print(request.form)
    with open(filename, 'a') as f:
        data = [
            request.form['word'],
            request.form['memo'],
            datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        ]
        f.write('\t'.join(data) + '\n')
    return jsonify({'status': 'ok'})


@app.route('/download/<path:filename>')
def download(filename):
    """donwload file"""
    return send_from_directory('.', filename)


if __name__ == '__main__':
    debug = False
    if len(sys.argv) > 1 and sys.argv[1] == 'debug':
        debug = True
    app.run(debug=debug)
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>index</title>
</head>
<body>
  <h1>memo app</h1>
  <h2>単語登録</h2>
    単語:<input type="text" id="word">
    メモ<textarea id="memo">メモ内容</textarea>
    <input type="button" id="register" value="登録">
  <h2>単語一覧</h2>
  <table border="1">
    <thead>
      <th>単語</th>
      <th>メモ</th>
      <th>調べた回数</th>
    </thead>
    <tbody>
      <td>hellow</td>
      <td>こんにちは</td>
      <td>1</td>
    </tbody>
  </table>
  <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
  <script>
    $(function() {
      $("#register").on('click', function() {
        postData = {
          "word": $("#word").val(),
          "memo": $("#memo").val()
        };
        $.post("{{ url_for('save_word') }}", postData, function(data) {
          console.log(data);
        })
      });
    });
  </script>
</body>
</html>