銀行
本作成の為の準備とか、教えて
学んだこと
マーケティングになるのかもしれませんが、
どのような内容が求められているか確認します。特に評価の高い書籍や評価コメントを見ると、良いアイデアや改善点が見つかるかもしれません。
本の構成(アウトライン)
1.章立て
2.章の構成(節・セクション)のアウトライン
3.リズムを作る(コーヒーブレイク)
4.コードを考える
5.画像を取得
ChatGPT
spdb.htmlで使われている
JavaScript
text-hover-py.js
pycat.js
divInput.js
eventTest.js
pmenu.js
init.js
cm.js
tornadoTest.js
gui2.js
<script src="text-hover-py.js?A=3" ></script>
<script src="pycat.js?A=3"></script>
<script src="divInput.js?p=(new Date()).getTime()"></script>
<script src="eventTest.js?p=(new Date()).getTime()"></script>
<script src="pmenu.js?p=(new Date()).getTime()"></script>
<script src="init.js?p=(new Date()).getTime()"></script>
<script src="cm.js?A=3"></script>
<script src="tornadoTest.js?A=3"></script>
<script src="gui2.js?A=3"></script>
DjangoをMySQLに対応させるには、以下の手順を行います。簡潔に、かつ確実に動くように整理しました。
✅ 手順一覧
① MySQLをインストール
すでにMySQLがインストール済みならスキップOKです。
Ubuntuの場合(例):
sudo apt install mysql-server
② Django用MySQLドライバをインストール(必須)
pip install mysqlclient
補足: mysqlclientは公式推奨。Cで書かれており高速。<br>
エラーが出る場合は以下のようなパッケージを先に入れる必要あり(Ubuntuの場合):
sudo apt install python3-dev default-libmysqlclient-dev build-essential
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pkg-config
(https://pypi.org/project/mysqlclient/)
③ MySQLにデータベースを作成
MySQLに入って、Django用のDBとユーザーを作る:
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;
④ Django設定ファイルを修正(settings.py)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
⑤ マイグレーションの実行(Django側)
python manage.py makemigrations
python manage.py migrate
🚨 注意点
mysqlclientがうまく入らない場合 → 代替で PyMySQL も使用可能(ただし非公式)
Windowsの場合、MySQL Connector/Cのインストールが必要になることがあります
utf8mb4 を使うことで絵文字なども保存可能(推奨)
tar -cf jan1.tar jan1
rsyncを使うと簡単にlocalがVPSに反映される!
rsync -avz -e "ssh -p 2222" bbs/ ubuntu@ptag.page:/home/ubuntu/bbs/
koba@koba-FMVD38001:~$ cd jan1
koba@koba-FMVD38001:~/jan1$ rsync -avz -e "ssh -p 2222" bbs/ ubuntu@ptag.page:/home/ubuntu/bbs/
sending incremental file list
./
db.sqlite3
media/images/
media/images/Screenshot_from_2025-03-15_04-08-04_m8kcJfQ.png
sent 429,405 bytes received 1,730 bytes 287,423.33 bytes/sec
total size is 4,960,570 speedup is 11.51
Djangoでユーザー登録をメール承認(認証)付きにするのは多少の設定が必要ですが、Djangoが提供する機能を活用すれば、それほど大変ではありません。以下に、ステップごとに分解して説明します。
デフォルトのユーザーモデルには「有効/無効」を管理するフィールドがないため、is_active フィールドを利用します。
is_active=False に設定し、メール認証後に True に変更します。forms.py (変更なし)上記で作成した CustomUserCreationForm をそのまま使用します。
Djangoの signing モジュールを利用して、メール認証用のトークンを生成します。
utils.py を新規作成します。
pythonfrom django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes, force_str
from django.contrib.auth.models import User
# トークン生成
def generate_email_verification_token(user):
return default_token_generator.make_token(user)
# トークンの検証
def verify_email_token(uidb64, token):
try:
uid = force_str(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
return None
if default_token_generator.check_token(user, token):
return user
return None
Djangoの send_mail を使ってメールを送信します。
views.pypythonfrom django.shortcuts import render, redirect
from django.contrib.auth import login
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes
from django.contrib.sites.shortcuts import get_current_site
from .forms import CustomUserCreationForm
from .utils import generate_email_verification_token
def register(request):
if request.method == "POST":
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False # 仮登録
user.save()
# メール送信
current_site = get_current_site(request)
subject = "Activate Your Account"
message = render_to_string("email_verification.html", {
"user": user,
"domain": current_site.domain,
"uid": urlsafe_base64_encode(force_bytes(user.pk)),
"token": generate_email_verification_token(user),
})
send_mail(subject, message, "no-reply@example.com", [user.email])
return render(request, "email_sent.html")
else:
form = CustomUserCreationForm()
return render(request, "register.html", {"form": form})
ユーザーがメールのリンクをクリックすると、アカウントが有効化されます。
views.pypythonfrom django.http import HttpResponse
from django.contrib.auth.models import User
from .utils import verify_email_token
def activate_account(request, uidb64, token):
user = verify_email_token(uidb64, token)
if user is not None:
user.is_active = True
user.save()
return HttpResponse("Your account has been activated! You can now log in.")
else:
return HttpResponse("Activation link is invalid!")
urls.py に登録用と有効化用のURLを追加します。
pythonfrom django.urls import path
from .views import register, activate_account
urlpatterns = [
path('register/', register, name='register'),
path('activate/<str:uidb64>/<str:token>/', activate_account, name='activate'),
]
email_verification.htmlhtmlHi {{ user.username }}, Please click the link below to verify your email address and activate your account: http://{{ domain }}{% url 'activate' uid=uid token=token %} Thank you!
settings.py にメール送信設定を追加します。
pythonEMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.example.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your_email@example.com'
EMAIL_HOST_PASSWORD = 'your_password'
DEFAULT_FROM_EMAIL = 'no-reply@example.com'
console.EmailBackend を使用すると、メールがコンソールに出力されます。pythonEMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
これで、Djangoでメール認証付きユーザー登録を実現できます!不明点や追加のカスタマイズがあれば、教えてください。
エラーは以下の2種類に分けられます。
・構文エラー
・例外エラー
構文エラー
Pythonの文法違反によるエラーで、プログラムの実行ができません。
例: 行末のコロン忘れやインデントの不正。発生すると即停止します。
例外エラー
実行時に発生するエラーで、tryとexceptを使って制御可能です。
適切に処理することでエラーの影響を回避できます。
try:
処理1
処理2
~
except エラー名:
エラー発生時の処理
このコードはPythonでエラー処理を行う方法を示す例です。
コードの概要
tryブロック
実行したい処理を記述します。ここでは、ユーザー入力を受け取り、
それを整数に変換して100を割る計算を試みています。
exceptブロック
特定のエラーが発生した場合に実行される処理を記述します。
処理の流れ
・ユーザーが数字を入力しない場合(例えば文字列を入力)、ValueError が発生し、
対応するメッセージが表示されます。
・ユーザーが 0 を入力した場合、ZeroDivisionError が発生し、割り算のエラーとしてメッセージを表示します。
・それ以外の予期しないエラーが発生した場合は、Exception によってキャッチされ、
エラー内容が表示されます。
出力例
1. 数字を正しく入力した場合
数字を入力して下さい: 10
結果 10.0
2. 0 を入力した場合
数字を入力して下さい: 0
0で割ることはできません
3. 数字以外の文字列を入力した場合
数字を入力して下さい: abc
値のチェックが必要です(数字でない)
4. 他のエラーが発生した場合(ほとんどの場合発生しない)
その他のエラー <エラー内容>
ポイント
・エラーを明確に分類して処理することで、ユーザーに適切なフィードバックを提供できます。
・Exception as e は、予測できないエラーの詳細を取得するのに役立ちます。
本作成のための準備として、効果的なステップや方法をいくつかご紹介します。準備段階でのしっかりした計画が、執筆をスムーズに進め、質の高い本を作成する手助けになりますよ。
これらの準備を進めながら執筆することで、スムーズに本作成が進み、完成度の高い内容を提供できます。
日本では「パラメトリックURL」を「動的URL」や「ダイナミックURL」と呼ぶことが多く、その他にも「変数URL」や「パラメータ付きURL」といった表現が使われます。これらの用語は、URLの一部に動的なパラメータを含めることを指しており、Djangoを使ったウェブアプリケーション開発でも広く使用されます。
グーグルクロームが対象ですが…
2024/12 追記
WebにはたくさんのPythonコードがあり、学習や確認に便利です。
しかし実行は面倒です、この機能を使うとすぐに実行(GUI対応)ができます。
インストール方法
・chrome ウェブストアのWebページから「Python Executor」で検索してインストール
・直接リンクしてインストール
https://chromewebstore.google.com/detail/python-executor/ndaaiopboibkjegeeiokjjnjembbidec?utm_source=ext_app_menu
使い方
・先ずはPythonExecutor拡張機能をインストールして、アイコンを表示させる
・実行させたいPythonコードをコピー&ペースのコピーだけする
(コード選択して、右クリックメニューでコピー)
or(コード選択して、コントール+Cを押下)
・アイコンをクリックするとウインドウが表示されて実行
日本語化
作成したプロジェクト内の「settings.py」の次の2箇所を変更する
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
settings.py
アプリ作成後には、アプリ名(自分の場合は、classApp)を登録
urls.pyを編集
作成したプロジェクトとアプリ ディレクトリの urls.pyを編集する
アプリ ディレクトリは新規作成します。
path('アプリ名/', include)
アプリ名を間違えたか、「settings.py」のINSTALLED_APPSにアプリ名が追加されていない。
アプリ名を間違えると
python manage.py makemigrations clasApp
No installed app with label 'clasApp'.
正常の場合
python manage.py makemigrations classApp
Migrations for 'classApp':
classApp\migrations\0001_initial.py
- Create model MemoModel
再度、実行するとファイル変更されていないので…
python manage.py makemigrations classApp
No changes detected in app 'classApp'
以上で準備が完了!
ソースだけです
サーバー側
from flask import Flask
from flask_sockets import Sockets
from flask import render_template
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
from werkzeug.routing import Rule
app = Flask(__name__)
sockets = Sockets(app)
# @sockets.route('/c2', websocket= True )
def echo_socket(ws):
#breakpoint()
print("kimasita")
while not ws.closed:
message = ws.receive()
if message != None:
ws.send(message)
sockets.url_map.add(Rule('/c2', endpoint=echo_socket, websocket=True))
@app.route('/')
def hello():
#return 'Hello World!'
return render_template("index.html")
if __name__ == "__main__":
server = pywsgi.WSGIServer(('', 8001), app, handler_class=WebSocketHandler)
server.serve_forever()
ブラウザ側
<html>
<head>
<title>gevent websocket test</title>
</head>
<body>
<h1>test</h1>
<div>
<input name="send_input" id="send_input" />
<input type="button" value="push" onclick="send_data()" />
</div>
<div>
<textarea id="view"></textarea>
</div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
var ws = new WebSocket("ws://ik1-446-55369.vs.sakura.ne.jp:8001/c2");
ws.onmessage = function(e) {
$("#view").html($("#view").val() + e.data + "\n");
};
function send_data() {
//ws.send( "abcdefg");
ws.send($("#send_input").val());
};
</script>
</body>
</html>
ホームページディレクトリを作成
その中にソースファイルを複数おいて、クリックして閲覧できるようにする。
HPでは、フォルダにindex.htmlが無いとフォルダのファイル一覧を表示します。
今回は、一覧を見やすく事と、正しくエンコードされて見れることに挑戦しましたよ!
それを次のような表示に改善します!!!
ファルダに「.htaccess」を作成してカスタマイズするとかなり便利なことが判明しました。
設定したファイル内容
removeHandler cgi-script .cgi .pl .py .rb
IndexIgnore .. __* *.html *.txt
HeaderName ./autoindex_head.html
ReadmeName ./autoindex_end.txt
IndexOptions SuppressHTMLPreamble
#IndexOptions FancyIndexing HTMLTable
IndexOptions FancyIndexing
IndexOptions NameWidth=*
autoindex_head.html
<html>
<head>
<title>abcdefg</title>
</head>
<body>
<h1>ファイル一覧</h1>
<p>ファイル内容の表示は、
ファイルをクリックして下さい
</p>
<script></script>
フォルダの内容は次のような感じで、HPで「src」をクリックすると「src」フォルダにはindex.htmlがないのでファイル一覧をApacheは表示してくれますね
.htaccessに次の設定を書くだけでも問題はないけね
このフォルダの上位「/book以下」では、CGIが起動できる設定にしまったので
最初の一行「removeHandler 」は必要になってしまいました。
removeHandler cgi-script .cgi .pl .py .rb
AddCharset UTF-8 .py
IndexIgnore .. __* *.html *.txt
mydbg.pyをクリックすると文字化しなく表示されました
次のソースコード(UTF-8で保存済み)でエラー発生
#!/usr/bin/python3
print("Content-Type: text/html; charset=utf-8\n")
print("あ")
Traceback (most recent call last):
File "/var/www/~ loginMain2.py", line 68, in <module>
print("\\u3042")
UnicodeEncodeError: 'ascii' codec can't encode character '\\u3042' in position 0: ordinal not in range(128)
修正方法
# micro /etc/apache2/apache2.conf
環境変数「LC_CTYPE 」をUTF-8にします。
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
SetEnv LC_CTYPE C.UTF-8
</Directory>
解決策まとめ
# cat /etc/issue
Ubuntu 14.04.6 LTS
# service apache2 stop
* Stopping web server apache2
# service apache2 start
* Starting web server apache2