≡ 11 | 会員制の掲示板 - {{ user }}
12 | 13 | 20 | 27 | 28 | {% for i in data %} 29 |{{ i.name }} - {{ i.date }}
31 |{{ i.text }}
32 |├── .gitignore ├── README.md └── src ├── apx ├── systemd │ └── myapp.service └── testapp │ ├── app.ini │ ├── app.py │ └── wsgi.py ├── ch3 ├── board-data.txt ├── board.py ├── cookie_counter.py ├── css │ ├── a_button.html │ ├── basic_head.html │ ├── buttons.html │ ├── grid-res.html │ ├── grid.html │ ├── grids-responsive-min.css │ └── pure-min.css ├── dice.cgi ├── get_test.py ├── hello.cgi ├── hello_flask.py ├── login_app.py ├── mul.py ├── nihongo.cgi ├── session_hello.py ├── template-card-if │ ├── app_keiji.py │ ├── app_yusuke.py │ ├── static │ │ └── style.css │ └── templates │ │ └── card-age.html ├── template-card │ ├── app.py │ └── templates │ │ └── card.html ├── template-etc │ ├── app.py │ └── templates │ │ ├── layout.html │ │ └── users.html ├── uploader │ ├── app.py │ └── static │ │ └── images │ │ └── README.md ├── user.py └── webstorage.html ├── ch4 ├── bbs │ ├── app.py │ ├── bbs_data.py │ ├── bbs_data_lock.py │ ├── bbs_login.py │ ├── data │ │ └── log.json │ ├── static │ │ ├── pure-min.css │ │ └── style.css │ └── templates │ │ ├── index.html │ │ ├── login.html │ │ └── msg.html ├── fileshare │ ├── README.md │ ├── app.py │ ├── data │ │ └── README.txt │ ├── files │ │ └── README.txt │ ├── fs_data.py │ ├── static │ │ ├── pure-min.css │ │ └── style.css │ └── templates │ │ ├── admin_list.html │ │ ├── error.html │ │ ├── index.html │ │ └── info.html ├── haikusns │ ├── app.py │ ├── data │ │ └── data.json │ ├── sns_data.py │ ├── sns_user.py │ ├── static │ │ ├── pure-min.css │ │ ├── side-menu.css │ │ ├── style.css │ │ └── ui.js │ └── templates │ │ ├── index.html │ │ ├── layout.html │ │ ├── layout_login.html │ │ ├── login_form.html │ │ ├── msg.html │ │ ├── users.html │ │ └── write_form.html └── photoshare │ ├── app.py │ ├── data │ └── README.md │ ├── photo_db.py │ ├── photo_file.py │ ├── photo_sqlite.py │ ├── setup_database.py │ ├── sns_user.py │ ├── static │ ├── pure-min.css │ ├── side-menu.css │ ├── style.css │ └── ui.js │ └── templates │ ├── album.html │ ├── album_new_form.html │ ├── index.html │ ├── layout.html │ ├── layout_login.html │ ├── login_form.html │ ├── msg.html │ ├── upload_form.html │ └── user.html ├── ch5 ├── JIGYOSYO.CSV ├── KEN_ALL.CSV ├── auth.py ├── auth2.py ├── counter.json ├── exif_gps.py ├── exif_list.py ├── exif_revgeo.py ├── geoip-test.py ├── geolocation-test.html ├── geolocation.html ├── gmap.html ├── osm-current.html ├── osm-map.html ├── osm-revgeo.py ├── osm-revgeo2.py ├── page.py ├── qrcode_hello.py ├── qrcode_more.py ├── revgeo.py ├── static │ ├── README.txt │ └── pure-min.css ├── test.jpg ├── users.json ├── webapp_qrcode.py ├── wiki │ ├── app.py │ ├── data │ │ ├── FrontPage.md │ │ └── test.md │ ├── static │ │ └── pure-min.css │ ├── templates │ │ ├── edit.html │ │ ├── new.html │ │ └── show.html │ └── wikifunc.py ├── wiki2 │ ├── app.py │ ├── data │ │ ├── FrontPage.md │ │ └── a.md │ ├── static │ │ └── pure-min.css │ ├── templates │ │ ├── edit.html │ │ ├── new.html │ │ └── show.html │ └── wikifunc.py ├── zip-api.py ├── zip-csv2sqlite.py ├── zip-form.html └── zip-test.py └── ch6 ├── hoge.txt ├── tell_path.py ├── write_text.py ├── write_text_utf8.py ├── xss_no.py └── xss_test.py /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | GeoLite2-ASN.mmdb 3 | GeoLite2-City.mmdb 4 | __pycache__ 5 | *.pyc 6 | # JIGYOSYO.CSV 7 | # KEN_ALL.CSV 8 | zip.sqlite 9 | 10 | 11 | # Byte-compiled / optimized / DLL files 12 | __pycache__/ 13 | *.py[cod] 14 | *$py.class 15 | 16 | # C extensions 17 | *.so 18 | 19 | # Distribution / packaging 20 | .Python 21 | build/ 22 | develop-eggs/ 23 | dist/ 24 | downloads/ 25 | eggs/ 26 | .eggs/ 27 | lib/ 28 | lib64/ 29 | parts/ 30 | sdist/ 31 | var/ 32 | wheels/ 33 | pip-wheel-metadata/ 34 | share/python-wheels/ 35 | *.egg-info/ 36 | .installed.cfg 37 | *.egg 38 | MANIFEST 39 | 40 | # PyInstaller 41 | # Usually these files are written by a python script from a template 42 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 43 | *.manifest 44 | *.spec 45 | 46 | # Installer logs 47 | pip-log.txt 48 | pip-delete-this-directory.txt 49 | 50 | # Unit test / coverage reports 51 | htmlcov/ 52 | .tox/ 53 | .nox/ 54 | .coverage 55 | .coverage.* 56 | .cache 57 | nosetests.xml 58 | coverage.xml 59 | *.cover 60 | *.py,cover 61 | .hypothesis/ 62 | .pytest_cache/ 63 | 64 | # Translations 65 | *.mo 66 | *.pot 67 | 68 | # Django stuff: 69 | *.log 70 | local_settings.py 71 | db.sqlite3 72 | db.sqlite3-journal 73 | 74 | # Flask stuff: 75 | instance/ 76 | .webassets-cache 77 | 78 | # Scrapy stuff: 79 | .scrapy 80 | 81 | # Sphinx documentation 82 | docs/_build/ 83 | 84 | # PyBuilder 85 | target/ 86 | 87 | # Jupyter Notebook 88 | .ipynb_checkpoints 89 | 90 | # IPython 91 | profile_default/ 92 | ipython_config.py 93 | 94 | # pyenv 95 | .python-version 96 | 97 | # pipenv 98 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 99 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 100 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 101 | # install all needed dependencies. 102 | #Pipfile.lock 103 | 104 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 105 | __pypackages__/ 106 | 107 | # Celery stuff 108 | celerybeat-schedule 109 | celerybeat.pid 110 | 111 | # SageMath parsed files 112 | *.sage.py 113 | 114 | # Environments 115 | .env 116 | .venv 117 | env/ 118 | venv/ 119 | ENV/ 120 | env.bak/ 121 | venv.bak/ 122 | 123 | # Spyder project settings 124 | .spyderproject 125 | .spyproject 126 | 127 | # Rope project settings 128 | .ropeproject 129 | 130 | # mkdocs documentation 131 | /site 132 | 133 | # mypy 134 | .mypy_cache/ 135 | .dmypy.json 136 | dmypy.json 137 | 138 | # Pyre type checker 139 | .pyre/ 140 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pythonではじめる Webサービス&スマホアプリの書きかた・作りかた 2 | 3 | 本リポジトリは、以下の書籍のサンプルコードとなります。 4 | 5 | - [書籍名] Pythonではじめる Webサービス&スマホアプリの書きかた・作りかた 6 | - [出版社] ソシム 7 | - [ISBN] ISBN-10: 4802612516 / ISBN-13: 978-4802612517 8 | - [購入はこちら](https://amzn.to/3ffX4tY) 9 | 10 | # ダウンロードの仕方 11 | 12 | サンプルプログラムをダウンロードするには、ページ右上にある緑色のボタン[Code]をクリックし、続いて[Download ZIP]をクリックします。 13 | そして、ZIPファイルを解凍してご利用ください。 14 | 15 | # 実行時注意のメモ 16 | 17 | (注意) 書籍では、Flaskの対象バージョンは、1.1.1となっております。 18 | 19 | ``` 20 | pip install Flask==1.1.1 21 | ``` 22 | 23 | なお、2022年のFlask 2.0でパラメータ名に仕様変更がありました。 24 | 25 | そのため、[こちら](https://github.com/pallets/flask/issues/4753)にあるように、send_fileを使う時、`attachment_filename`を`download_name`と変更してください。 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/apx/systemd/myapp.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=uWSGI instance for testapp 3 | After=syslog.target 4 | 5 | [Service] 6 | ExecStart=/home/vagrant/.pyenv/shims/uwsgi --ini /home/vagrant/testapp/app.ini 7 | WorkingDirectory=/home/vagrant/testapp 8 | 9 | User=vagrant 10 | Group=www-data 11 | RuntimeDirectory=uwsgi 12 | Restart=always 13 | KillSignal=SIGQUIT 14 | Type=notify 15 | StandardError=syslog 16 | NotifyAccess=all 17 | 18 | [Install] 19 | WantedBy=multi-user.target 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/apx/testapp/app.ini: -------------------------------------------------------------------------------- 1 | [uwsgi] 2 | module = wsgi:app 3 | master = true 4 | socket = /tmp/uwsgi.sock 5 | chmod-socket = 666 6 | wsgi-file=/home/vagrant/testapp/wsgi.py 7 | logto=/home/vagrant/testapp/uwsgi.log 8 | -------------------------------------------------------------------------------- /src/apx/testapp/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | app = Flask(__name__) 3 | 4 | @app.route('/') 5 | def index(): 6 | return 'Hello, Hello, Hello!' 7 | 8 | if __name__ == "__main__": 9 | app.run(host='0.0.0.0') 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/apx/testapp/wsgi.py: -------------------------------------------------------------------------------- 1 | from app import app 2 | 3 | if __name__ == '__main__': 4 | app.run() 5 | 6 | -------------------------------------------------------------------------------- /src/ch3/board-data.txt: -------------------------------------------------------------------------------- 1 | Flask(フラスク)は、プログラミング言語Python用の、軽量なウェブアプリケーションフレームワークである。標準で提供する機能を最小限に保っているため、自身を「マイクロフレームワーク」と呼んでいる★ -------------------------------------------------------------------------------- /src/ch3/board.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request, redirect 2 | import os 3 | app = Flask(__name__) 4 | 5 | # データの保存先 --- (*1) 6 | DATAFILE = './board-data.txt' 7 | 8 | # ルートにアクセスしたとき --- (*2) 9 | @app.route('/') 10 | def index(): 11 | msg = 'まだ書込はありません。' 12 | # 保存データを読む --- (*3) 13 | if os.path.exists(DATAFILE): 14 | with open(DATAFILE, 'rt') as f: 15 | msg = f.read() 16 | # メッセージボードと投稿フォーム --- (*4) 17 | return """ 18 |
19 |あいうえお
18 |かきくけこ
21 |さしすせそ
24 |あいうえお
17 |かきくけこ
20 |さしすせそ
23 |あなたはログイン中です。
58 | 59 | """ 60 | 61 | @app.route('/logout') 62 | def logout_page(): 63 | try_logout() # ログアウト処理を実行 --- (*8) 64 | return """ 65 |年齢は、{{ age }}才(未成年)です。
11 |連絡先は非公開です。
12 | {% else %} 13 |年齢は、{{ age }}才です。
14 |メールアドレスは、{{ email }}です。
15 | {% endif %} 16 |年齢は、{{ age }}才です。
5 |メールアドレスは、{{ email }}です。
6 |年齢は、{{ user.age }}才です。
15 |URL: {0}
File: {1}
{{ i.name }} - {{ i.date }}
31 |{{ i.text }}
32 |ファイルの情報:
18 |所有者 | 21 |{{ meta.name }} | 22 |
---|---|
ファイルの説明 | 25 |{{ meta.memo }} | 26 |
ファイル名 | 29 |{{ meta.filename }} | 30 |
ダウンロード回数 | 33 |{{ meta.count }} | 34 |
保存期限 | 37 |{{ meta.time_limit | datetime }} | 38 |
ダウンロード先の情報:
44 |URL | 47 |48 | |
---|---|
パスワード | 51 |{{ meta.pw }} | 52 |
33 | {{ i.time | datestr }} 34 | 作: {{ i.id }}
35 |{{ t.time | datestr }}
33 |以下よりアルバムを作成できます。
36 | →新規アルバムを作成 38 |