Django入门 – 一个简单的访问记录展示应用程序
はじめに
TL;DR
記事の内容について
環境
参考ページ
作成したコード
Djangoのインストール
今回のアプリを初期セットアップ
簡単にファイルを追加して動作確認
作り込み
動作確認
まとめ
2023/05/14 17:38追記
首先
梗概;总之
-
- Djangoは簡単なウェブアプリ作るのには便利で楽。
- Python触ったことなくてもある程度書ける。
关于这篇文章的内容
-
- JavaエンジニアがDjangoに入門してみた内容
-
- Djangoの入門にあたり、以下の様なの簡単なアプリを作成
ページにアクセスするたび、アクセス元IP、アクセス時間をページに表示する
データベースにはPostgreSQLを使用する
Python歴1日(ソース読んだだけ)でのチャレンジなので、文法・記法的なところでお見苦しいところがあるかもしれませんが、お許しください(おすすめページとかあれば教えていただけると幸いです。)
ソースを読んだ時の記事(https://qiita.com/ramune2371/items/e7e8044f88124a545e95)
环境
-
- 端末:MacBookAir M1
-
- Python:3.10.6
-
- pip:23.1.1
-
- psql:psql (PostgreSQL) 14.8 (Homebrew)
- Docker:Docker Desktop 4.7.1 (77678)
请参考以下网页
编写的代码。
Django的安装
- pipを使用してインストール
$ pip install Django
进行此应用程序的初始设置
通过使用 djang-admin startproject,可以轻松地创建 Django 的初始文件。
$ django-admin startproject access_history
$ ls -alh
total 24
drwxr-xr-x 21 username staff 672B 5 13 23:21 .
drwxr-xr-x+ 78 username staff 2.4K 5 13 23:22 ..
drwxr-xr-x 4 username staff 128B 5 13 23:21 access_history
$ cd access_history
$ ls -alh
total 8
drwxr-xr-x 5 username staff 160B 5 13 23:24 .
drwxr-xr-x 21 username staff 672B 5 13 23:21 ..
drwxr-xr-x 8 username staff 256B 5 13 23:24 access_history
-rwxr-xr-x 1 username staff 670B 5 13 23:21 manage.py
当查看已创建的文件夹时,发现里面有一个名为manage.py的文件,似乎用于启动服务器等操作。
于是我尝试了一下启动。
$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
May 13, 2023 - 14:27:43
Django version 4.2.1, using settings 'access_history.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[13/May/2023 14:27:49] "GET / HTTP/1.1" 200 10731
[13/May/2023 14:27:50] "GET /static/admin/css/fonts.css HTTP/1.1" 404 1816
简单地添加文件并进行操作确认。
请将以下文件添加到access_history/access_history文件夹中。
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello World")
修改 access_history/access_history/urls.py 文件。
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
from django.contrib import admin
from django.urls import path
from . import hello
urlpatterns = [
path('hello/', hello.hello, name='hello'),
path('admin/', admin.site.urls),
]
我成功访问(&向全世界问好)了。
精心制作
首先,我们需要在Django项目中添加功能,以便于创建访问历史记录的展示页面。
$ python manage.py startapp history
根据以下方式对已创建的文件进行修正(因篇幅较长,请折叠查看→按顺序进行更改或添加文件。文件名:以(追加/更改)的方式写入)。
from django.db import models
from django.core.exceptions import ValidationError
import re
# IP地址的验证
pattern = “([0-9]{3}\.){3}\.[0-9]{3}”
matcher = re.compile(pattern)
def validate_ip(value):
if not matcher.match(value):
raise ValidationError(
_(“%{value} 不是有效的IP地址!”),
params={“value”,value}
)
class AccessHistory(models.Model):
# 数据设置
ip=models.CharField(“IP”,max_length=200,validators=[validate_ip])
access_time=models.DateTimeField(“访问时间”)
# 重写 __str__ 方法
# 在页面显示时使用
def __str__(self) -> str:
return “IP地址:%s / 访问时间:%s” % (self.ip,self.access_time)
history/list_page.py(添加)
from django.http import HttpResponse
from django.utils import timezone as tz
from history.models import AccessHistory
class ListPage:
def list(request):
# 从请求中获取IP信息
ip = request.META.get(‘REMOTE_ADDR’)
# 存储到表中
AccessHistory(ip=ip,access_time=tz.datetime.now()).save()
# 构建响应
query_set = AccessHistory.objects.all()
response_str=”
for qs in query_set:
response_str = response_str + str(qs) + ”
”
# 返回响应
return HttpResponse(response_str)
history/urls.py(更改)
from django.urls import path
from history.list_page import ListPage
urlpatterns = [
# 注册 ListPage.list,不在 history 子目录下需要指定路径
path(”, ListPage.list , name=”list”),
]
access_history/urls.py(更改)
from django.contrib import admin
from django.urls import path,include
from . import hello
urlpatterns = [
path(‘hello/’, hello.hello, name=’hello’),
# ↓ 添加的行。在这里指定路径,所以在 history/urls.py 中不指定路径。
path(‘list/’, include(“history.urls”)),
path(‘admin/’, admin.site.urls),
]
以上是功能的创建。
接下来在 access_history/settings.py 中注册功能,并与数据库关联
access_history/settings.py
INSTALLED_APPS = [
#↓ 添加的行。history.apps.HistoryConfig 是在 Django 中注册功能所使用的类
‘history.apps.HistoryConfig’,
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
]
在Django中,可以将Model与数据库关联起来。
就我们这次创建的AccessHistory而言,它的字段ip和access_time可以与数据库一起关联,并附带类型信息。
稍后会提到,根据这个Model,可以自动创建表格。
由于这次想在数据库中使用PostgreSQL,需要安装额外的库并进行一些文件修正。
$ pip install psycopg
为了尝试,可以使用Docker设置并启动PostgreSQL,并将其设为可以轻松丢弃的状态。
$ docker run -d --name postgres -e POSTGRES_PASSWORD='p@ssw0rd' -p 5432:5432 postgres:14.7-bullseye
$ psql -h localhost -U postgres # 今回使用するデータベースを作成するため、一度接続
Password for user postgres: <p@ssw0rdを入力しEnter>
psql (11.20, server 11.3 (Debian 11.3-1.pgdg90+1))
Type "help" for help.
postgres=# create database access_history;
CREATE DATABASE
postgres=# \q
修改Django的配置文件,以便可以连接到PostgreSQL。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'access_history',
'HOST': 'localhost',
'USER': 'postgres',
'PASSWORD': 'p@ssw0rd',
'PORT': '5432',
}
}
使用manage.py来进行数据库设置。
$ python manage.py makemigrations history # こいつで、history/models.pyをデータベースと紐付け
$ python manage.py migrate # データベースの初期化(テーブル作成等)。エラーが出なければOK
看起来,据说从 models.py 链接的表名将会是<创建app时的名称>_<将类名小写>。这次的话,会是 history_accesshistory(有点笨拙,但还好吧……就这样吧……)
确认动作 (Confirm action)
$ paython manage.py runserver # 起動
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
May 14, 2023 - 14:09:55
Django version 4.2.1, using settings 'access_history.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
我這次想要從Django的後端觀點來學習,所以前端的開發我打算視情況再做(大概)。結果做了一點點,可以參考頁面底部的附註。
总结
-
- Django、すごく便利
sql書かずにPostgreSQLが使えてしまった…
機能の拡張が簡単
他にもたくさん便利機能があるというのだから驚き
Pythonが思ったより書きやすかった
2023年05月14日17时38分补充说明
由于我非常在意,所以我添加了以下更改。
-
- フロントエンドをDjangoのテンプレート機能+Bootstrapを使用してもう少しまともに
- Djangoでは、DBに登録する際にUTCに変換されるため、DBから取得した値をフロントで使用する前にTZに合わせたものに変更するよう修正
请参考以下提交来修正内容:https://github.com/ramune2371/access_history/commit/2b89566d98e71dc5bd883b108420cf86696f1538#diff-c62fe861387b8d587fd54e896c8cf2069cb178d8f15fa78429a8a6df22dea1c6