tag:crieit.net,2005:https://crieit.net/tags/Python%E3%81%A7%E3%81%AA%E3%82%93%E3%81%8B%E6%9B%B8%E3%81%8F/feed 「Pythonでなんか書く」の記事 - Crieit Crieitでタグ「Pythonでなんか書く」に投稿された最近の記事 2019-07-05T23:11:14+09:00 https://crieit.net/tags/Python%E3%81%A7%E3%81%AA%E3%82%93%E3%81%8B%E6%9B%B8%E3%81%8F/feed tag:crieit.net,2005:PublicArticle/15208 2019-07-05T23:11:14+09:00 2019-07-05T23:11:14+09:00 https://crieit.net/posts/Flask-5d1f5a82636fa Flaskで掲示板を作る <h1 id="Flaskで掲示板を作る"><a href="#Flask%E3%81%A7%E6%8E%B2%E7%A4%BA%E6%9D%BF%E3%82%92%E4%BD%9C%E3%82%8B">Flaskで掲示板を作る</a></h1> <h2 id="フォルダ構成"><a href="#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90">フォルダ構成</a></h2> <p>フォルダ構成は以下のようになります。</p> <pre><code class="python"><br />/flask/templates/index.html layout.html bbs_result.html /test.py </code></pre> <h2 id="ライブラリ"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA">ライブラリ</a></h2> <p>Flask==1.0.2<br /> Flask-SQLAlchemy==2.3.2<br /> Jinja2==2.10<br /> SQLAlchemy==1.2.15<br /> sqlite3</p> <h3 id="SQLAlchemy"><a href="#SQLAlchemy">SQLAlchemy</a></h3> <p>pythonのORMモジュールです。<br /> ORMはSQLをクラスとして扱えるようにしたものです<br /> 使用する理由は、<br /> + SQLインジェクション対策がサポートされる。<br /> + クラスなので、SQLをオブジェクト指向で書ける。<br /> + 引数に変数を入れるため、文字列の結合などが必要ないので短く書ける。</p> <p>導入の注意点は、<br /> + ちょっとしたSQLを実行する場合は、ORMを使わない方がコード量が短い。<br /> + 英語の文献が多いので学習コストが必要。<br /> + 慣れないうちはブラックボックスのコード。</p> <p>SQLを操作しやすくする便利な奴くらいで覚えておきましょう。</p> <h2 id="データベース構造"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0">データベース構造</a></h2> <p>簡単にこれだけのデータを持たせることにします。</p> <div class="table-responsive"><table> <thead> <tr> <th>id</th> <th>日付</th> <th>名前</th> <th>文章</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>date1</td> <td>name1</td> <td>text1</td> </tr> <tr> <td>2</td> <td>date2</td> <td>name2</td> <td>text2</td> </tr> </tbody> </table></div> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <h3 id="test.py"><a href="#test.py">test.py</a></h3> <pre><code class="python">from flask import Flask, request, render_template from datetime import datetime from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) db_uri = 'sqlite:///test.db' app.config['SQLALCHEMY_DATABASE_URI'] = db_uri db = SQLAlchemy(app) class Article(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) pub_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) name = db.Column(db.Text()) article = db.Column(db.Text()) @app.route("/") def bbs(): text = Article.query.all() return render_template("index.html", lines=text) @app.route("/result", methods=["POST"]) def result(): date = datetime.now() article = request.form["article"] name = request.form["name"] admin = Article(pub_date=date, name=name, article=article) db.session.add(admin) db.session.commit() return render_template("bbs_result.html", article=article, name=name, now=date) if __name__ == "__main__": app.run(debug=True) </code></pre> <h3 id="layout.html"><a href="#layout.html">layout.html</a></h3> <pre><code class="html"><!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>BBS</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css"> <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script> </head> <body> {% block content %} {% endblock %} </body> </html> </code></pre> <h3 id="index.html"><a href="#index.html">index.html</a></h3> <pre><code class="html">{% extends "layout.html" %} {% block content %} <section class="hero is-primary"> <div class="hero-body"> <div class="container"> <h1 class="title"> 掲示板</h1> </div> </div> </section> <div class="container"> <form action="/result" method="post"> <div class="field"> <label class="label">Name</label> <div class="control"> <input class="input" type="text" placeholder="Text input" name="name"> </div> </div> <div class="field"> <label class="label">Message</label> <div class="control"> <textarea class="textarea" name="article"></textarea> </div> </div> <button class="button" type="submit">作る</button> </form> </div> <div class="container"> <h2>投稿一覧</h2> <ul> {% for line in lines: %} <li><span>{</span><span>{</span>line.name<span>}</span><span>}</span> <span>{</span><span>{</span>line.article<span>}</span><span>}</span></li> {% endfor %} </ul> {% endblock %} </div> </code></pre> <h3 id="bbs_result.html"><a href="#bbs_result.html">bbs_result.html</a></h3> <pre><code class="html">{% extends "layout.html" %} {% block content %} <h1>書き込みました</h1> <br> <p><span>{</span><span>{</span> now <span>}</span><span>}</span> <span>{</span><span>{</span> name <span>}</span><span>}</span> <span>{</span><span>{</span> article <span>}</span><span>}</span></p> <form action="/" method="get"> <button type="submit">戻る</button> </form> {% endblock %} </code></pre> <p>この辺りはテンプレートの定義ですので<a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/flask/flask_template.html">Flaskでテンプレートを使うを参照</a></p> <h2 id="データベースを作成"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90">データベースを作成</a></h2> <pre><code class="python">class Article(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) pub_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) name = db.Column(db.Text()) article = db.Column(db.Text()) </code></pre> <p>ここでデータを定義します。<br /> <code>db.Integer</code>、<code>db.Text()</code>など受け取るデータの型を定義しています。</p> <pre><code class="python">db_uri = 'sqlite:///test.db' app.config['SQLALCHEMY_DATABASE_URI'] = db_uri db = SQLAlchemy(app) </code></pre> aocory tag:crieit.net,2005:PublicArticle/15200 2019-07-04T08:45:36+09:00 2019-07-04T08:45:36+09:00 https://crieit.net/posts/Flask Flaskでテンプレートを読み込む <h1 id="Flaskでテンプレートを読み込む"><a href="#Flask%E3%81%A7%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80">Flaskでテンプレートを読み込む</a></h1> <p>Flaskには標準でJinja2というテンプレートエンジンが付いています。<br /> templatesというフォルダを作り、そこに、htmlを置きます。</p> <h2 id="フォルダ構成"><a href="#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90">フォルダ構成</a></h2> <p>フォルダ構成は以下のようになります。</p> <pre><code class="python">flask/run.py /templates/layout.html /hello.html </code></pre> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <h3 id="layout.html"><a href="#layout.html">layout.html</a></h3> <pre><code class="html"><!doctype html> <html> <head> <title><span>{</span><span>{</span> title <span>}</span><span>}</span></title> </head> <body> {% block content %} <!-- ここにメインコンテンツを書く --> {% endblock %} </body> </html> </code></pre> <h3 id="hello.html"><a href="#hello.html">hello.html</a></h3> <pre><code class="html">{% extends "layout.html" %} {% block content %} <h3>Hello</h3> こんにちは。<span>{</span><span>{</span> name <span>}</span><span>}</span>さん。 {% endblock %} </code></pre> <h3 id="run.py"><a href="#run.py">run.py</a></h3> <pre><code class="python">from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): name = "Hoge" return render_template('hello.html', title='flask test', name=name) if __name__ == "__main__": app.run(debug=True) </code></pre> <h2 id="コード解説"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E8%AA%AC">コード解説</a></h2> <h3 id="layout.html"><a href="#layout.html">layout.html</a></h3> <p>共通テンプレートです。<br /> フッターとかヘッダーとかをここに定義するといいと思います。</p> <pre><code class="html">{% block content %} <!-- ここにメインコンテンツを書く --> {% endblock %} </code></pre> <p>通常のHTMLと異なる部分は上記部分のみです。<br /> <code>{% block content %}</code>と<code>{% endblock %}</code>部分にコンテンツをインポートします。</p> <h3 id="hello.html"><a href="#hello.html">hello.html</a></h3> <p>コンテンツ部分です。<br /> 今回はこんにちは。<code><span>{</span><span>{</span> name <span>}</span><span>}</span></code>さん。と表示させます。</p> <pre><code class="html">{% extends "layout.html" %} {% block content %} <h3>Hello</h3> こんにちは。<span>{</span><span>{</span> name <span>}</span><span>}</span>さん。 {% endblock %} </code></pre> <p><code>{% extends "layout.html" %}</code>でlayout.htmlを継承しています。</p> <h3 id="run.py"><a href="#run.py">run.py</a></h3> <pre><code class="python">def hello(): name = "Hoge" return render_template('hello.html', title='flask test', name=name) </code></pre> <p><code>return render_template('hello.html', title='flask test', name=name)</code>この部分でhello.htmlを呼び出しタイトルとnameの変数を渡しています。</p> <p>他の部分の説明は<a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/flask/flask_hello.html">Flaskでhello world</a></p> aocory tag:crieit.net,2005:PublicArticle/15195 2019-07-03T17:31:24+09:00 2019-07-03T17:31:24+09:00 https://crieit.net/posts/Flask-Hello-World-Python FlaskでHello Worldと表示させる|Pythonでなんか書く <h1 id="FlaskでHello Worldと表示させる"><a href="#Flask%E3%81%A7Hello+World%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B">FlaskでHello Worldと表示させる</a></h1> <h2 id="フォルダ構成"><a href="#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90">フォルダ構成</a></h2> <p>フォルダ構成は以下のようになります。</p> <pre><code class="python"><br />/flask/run.py </code></pre> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <pre><code class="python">from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<html><body><h1>Hello World</h1></body></html>' if __name__ == '__main__': app.run(debug=True) </code></pre> <h2 id="コード解説"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E8%AA%AC">コード解説</a></h2> <h3 id="Flask読み込み"><a href="#Flask%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF">Flask読み込み</a></h3> <p><code>from flask import Flask</code></p> <h3 id="Flaskインスタンスの呼び出し"><a href="#Flask%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97">Flaskインスタンスの呼び出し</a></h3> <p><code>app = flask.Flask(__name__)</code> という行は、 Flask クラスのインスタンスを作って、 <code>app</code> という変数に代入しています。</p> <p>オブジェクトの属性にアクセスする場合は、 <code>.</code> という記号を使って、<br /> <code>オブジェクト名.要素名</code> のようにします。</p> <p>クラスのインスタンスの場合はメソッドやメンバー変数が属性になりますが、 モジュールの場合はそのモジュールが持っているクラスや関数などが属性になります。</p> <p>この場合、flaskモジュールが提供しているFlaskクラスを利用していることになります。</p> <p><code>__name__</code> というのは、自動的に定義される変数で、現在のファイルのモジュール名が入ります。</p> <p>ファイルをスクリプトとして直接実行した場合、 <code>__name__</code> は <code>__main__</code> になります。</p> <h2 id="ルーティング"><a href="#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">ルーティング</a></h2> <p><code>@app.route('/')</code>という行は、<code>app</code> に対して <code>/</code> というURLに対応するアクションを登録しています。</p> <p><code>@</code>で始まる行はデコレータといって、その次の行で定義する関数やクラスに対して何らかの処理を行います。</p> <p><code>@app.route('/')</code> は、次の行で定義される関数を指定した<code>URL</code>にマッピングするという処理を実行しています。</p> <h2 id="index関数を定義"><a href="#index%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9">index関数を定義</a></h2> <p><code>def index():</code> という行は、defという関数を定義しています。</p> <h2 id="HTMLを返す"><a href="#HTML%E3%82%92%E8%BF%94%E3%81%99">HTMLを返す</a></h2> <p><code>return '<html><body><h1>Hello World</h1></body></html>'</code> は、 'Hello, World!' という文字列を返しています。</p> <p><code>app.run(debug=True)</code> という行は、Flaskが持っている開発用サーバーを、デバッグモードで実行しています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/flask/">flask入門</a></p> aocory tag:crieit.net,2005:PublicArticle/15181 2019-07-01T10:40:49+09:00 2019-07-01T10:40:49+09:00 https://crieit.net/posts/for-Python forを用いた組み合わせ|Pythonでなんか書く <h1 id="forを用いた組み合わせ"><a href="#for%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B">forを用いた組み合わせ</a></h1> <p>これはPythonプログラムで、3つの異なる数字を受け取り、その数字から可能なすべての組み合わせを出力します。</p> <h2 id="問題の説明"><a href="#%E5%95%8F%E9%A1%8C%E3%81%AE%E8%AA%AC%E6%98%8E">問題の説明</a></h2> <p>プログラムは3つの異なる数字を取り、その数字から可能なすべての組み合わせを出力します。</p> <h2 id="考え方"><a href="#%E8%80%83%E3%81%88%E6%96%B9">考え方</a></h2> <ol> <li>1番目、2番目、3番目の数値を取り、別々の変数に格納します。</li> <li>その後、3つの番号をすべてリストに追加します。</li> <li>3つのforループを使用し、互いに等しいインデックスがない場合は、リスト内の数字を出力します。</li> <li>終了します。</li> </ol> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <p>以下はPythonプログラムのソース・コードで、3つの異なる数字を受け取り、その数字から可能なすべての組み合わせを出力します。プログラムの出力も以下に示します。</p> <pre><code class="python">  a=int(input("Enter first number:")) b=int(input("Enter second number:")) c=int(input("Enter third number:")) d=[] d.append(a) d.append(b) d.append(c) for i in range(0,3): for j in range(0,3): for k in range(0,3): if(i!=j&j!=k&k!=i): print(d[i],d[j],d[k]) </code></pre> <h2 id="コードの解説"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A7%A3%E8%AA%AC">コードの解説</a></h2> <ol> <li>ユーザーは1番目、2番目、3番目の番号を入力する必要があります。</li> <li>比較しやすいように、すべての要素がリストに追加されます。</li> <li>forループの範囲は0~2で、基本的にはリスト内の3つの要素のインデックスです。</li> <li>すべての索引が互いに等しくない場合は、リスト内の特定のエレメントに関連付けられたエレメントが印刷されます。</li> </ol> <h2 id="出力例"><a href="#%E5%87%BA%E5%8A%9B%E4%BE%8B">出力例</a></h2> <pre><code class="python">Case 1: Enter first number:1 Enter second number:2 Enter third number:3 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 </code></pre> <p>Case 2:</p> <pre><code class="python">Enter first number:5 Enter second number:7 Enter third number:3 5 7 3 5 3 7 7 5 3 7 3 5 3 5 7 3 7 5 </code></pre> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/list/list_append.html">append()</a><br /> <a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/keywords/keyword_for.html">for</a></p> aocory