Published Date : 2019年5月3日4:01
# 適当なフォルダの中に入る。 C:\適当な場所> cd 適当なフォルダ C:\適当な場所\適当なフォルダ> django-admin startporject markovapp

C:\user> python manage.py startapp markovblog

<!DOCTYPE html>
<html lang="jp-ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>markov blog app</title>
<!-- bootstrap の css link -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.0/css/bootstrap.min.css" integrity="sha384-PDle/QlgIONtM1aqA2Qemk5gPOE7wFq8+Em+G/hmo5Iq0CCmYZLv3fVRDJ4MMwEA" crossorigin="anonymous">
</head>
<body>
<div class="container">
<form action="" method="get">
<div class="custom-form">
<select class="custom-select" name="select_name">
<option selected>マルコフりたい人を選んでね。</option>
<!-- Jinja2 の For Loop -->
{% for m in model_names %}
<option value="{{ m }}" name="{{ m }}">{{ m }}</option>
{% endfor %}
<input type="submit" value="マルコフる">
</div>
</form>
<div class="container">
<h3>{{model_name}}さんのマルコブログ</h3>
</div>
<div class="container">
<!-- Jinja2 の For Loop -->
{% for a_s in mm_sentence %}
<p>{{a_s}}</p>
{% endfor %}
</div>
</div>
<!-- bootstrap の javascript link -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.0/js/bootstrap.min.js" integrity="sha384-7aThvCh9TypR7fIc2HV4O/nFMVCBwyIUKL8XCtKE+8xgCgl/PQGuFsvShjr74PBp" crossorigin="anonymous"></script>
</body>
</html>

# 必要なモジュールをインポート
from django.shortcuts import render
import os,sqlite3,bz2,pickle
import pandas as pd
# まず先にDBからデータを取り出し、
# 引数で渡される名前を判定して、
# 指定された名前のモデルだけ返す関数を作ります。
def set_data(model_name):
# これは前の記事で説明したファイルパスを決めるやりかた。
# settings.pyにも書いてあります。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
dbname=os.path.join(BASE_DIR, 'mmblog_markov_model.sqlite3')
# 前回の記事で使用したやり方。
conn = sqlite3.connect(dbname)
select_sql = 'select * from markovmodels'
# データフレームに直して
# 名前のリスト作成と、判定をしやすくする。
df = pd.read_sql_query(select_sql, conn)
# 名前のリスト作成
# 判定に不要な文字列を取り除く。
model_names = [name.replace('./','') for name in df['name'].tolist()]
# 引数で渡された名前と一致するモデルを探し出し、
# もろもろ解凍。
if model_name in model_names:
i=model_names.index(model_name)
mm_model=pickle.loads(bz2.decompress(df.loc[i,'blog_model']))
# もし、渡された名前がモデルに無かったら、
# デフォルトで入る文字をmm_modelに入れる。
else:
mm_model=['セレクトバーからマルコフりたい人を選んでね。']
# 忘れずにSqlite3の電源をOFFにする。
conn.close()
# 指定されたモデルと、
# セレクトタグで表示するための
# 名前のリストを
# メインの関数へ渡してあげる
return mm_model,model_names
def return_markov_model(request):
# GETメッソドから渡された値を受け取ります。
model_name=request.GET.get('select_name')
# 渡された値でモデルがあるか判定。
# モデルとモデルの名前を受け取る。
mm_model,model_names=set_data(model_name)
# 作成する文章を入れるための空のリスト。
mm_sentence=[]
# ここで、GETで正しいモデルの名前を選んだか判定。
if model_name in model_names:
# もし、モデルが正しいなら、
# 10回マルコフモデルから文章を作成する。
for _ in range(10):
#一時的に生成した文章を入れる。
temp_sentence=mm_model.make_sentence()
# その文章がNoneで無ければ。
if temp_sentence is not None:
# 予定通り、いらない空白などを消して、
# 文章を表示させるためのリストに付け足していく。
mm_sentence.append(''.join(temp_sentence.split(' ')))
# 文章作成に失敗してNoneが返されたら、
# 何もしないで、ループを続ける。
else:
continue
# もし、正しいモデルの名前をユーザーが選ばなかったら
# デフォルトの文字リストを入れる。
else:
mm_sentence=mm_model
# renderメソッドで値を合成するHTMLファイルを辞書と共に指定して返す。
return render(request, 'markovblog/app.html',{'mm_sentence':mm_sentence,'model_name':model_name,'model_names':model_names})

from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('markovblog/',include('markovblog.urls')),
]

from django.urls import path
from . import views
urlpatterns = [
path('',views.return_markov_model,name="return_markov_model")
]
INSTALLED_APPS = [
.............................,
.............................,
.............................,
'markovblog.apps.MarkovblogConfig',
]
python manage.py runserver




