(自用)Django_1(基本的的Hello World模板)
项目
-
- 创建Django项目
-
- 指定服务器地址
-
- 尝试运行Django
-
- Hello World
-
- 调用模板(html)
- 将数据从py一侧传递到模板
1. 成立项目
-
- プロジェクト = アプリケーションをまとめる単位
-
- APPの機能ごとにアプリケーションを作り、最後にそれを馬鹿でかいプロジェクトに纏めるとかが良いと思う
- 環境構築に関してはDjango_環境構築みたいなのに後日書くかもしれんし書かないかもしれん
# 一回Djangoのバージョンだけ確認しておく
$ python -m django --version
# myappってプロジェクトを作る、startprojectって入れる事でプロジェクトの中身もある程度用意してくれる
$ django-admin startproject myapp
-
- これによって、自分が居たディレクトリの中にmyappってディレクトリが出来ている
myappの中身
manage.py:このプロジェクトを動かしたり管理したりする時に使う、名前そのまま
myapp(myappの中にもう1つmyappがある)
__init__.py:このディレクトリでPythonを使うと宣言する
asgi.py:ASGI互換サーバに接続する際の基点になるらしい、よく分からない
settings.py:ここを編集する事でプロジェクトの設定を弄れる
urls.py:ここに接続した時、どのdefを動かすかを決める
wsgi.py:WSGI互換サーバに接続する際の基点、全然分からない
startprojectによって上に書いた馬鹿でかいプロジェクトが作れる
2. 指定服务器地址
- サーバからどのアドレスに接続すれば良いかを教えてあげる
# ここを見つけ出して、自分のページのアドレスを入れる
# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG = True
ALLOWED_HOSTS = ["自分のアドレス"]
尝试运行Django。
# myappへ移動
$ cd myapp
# Djangoのサーバを動かす
$ python manage.py runserver
https://localhost:8000/にアクセスして、ロケットが出てくれば成功
言うまでも無いが、実行終了はCtrl + c
你好,世界
- プロジェクト = アプリケーションが沢山集まったもの
# 上で作ったmyapp(馬鹿でかいプロジェクト)に移動
$ cd myapp
# myapp内にアプリーション作成、startappでアプリケーションを作るよと宣言
# 例に漏れず作ったアプリケーションの中に有る程度用意がされている
$ python manage.py startapp hello
myapp
┣━ hello
┣━ manage.py
┗━ myapp
-
- こんな感じのディレクトリが出来上がる
helloの中身は取り敢えずviews.pyだけ意識すればOK
views.pyはバックエンドの動きとかを書く場所、Flaskのpyファイルと同じ
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
index(request)で、この関数が要求された時にHttpResponse()の中に入った値を返す
requestメソッドされたらHttpResponseの中身を返すと覚えればOK
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('hello/', include('hello.urls')),
path('admin/', admin.site.urls),
]
-
- プロジェクトのルーティング
-
- このパスの時にどのアプリケーションを動かすかを設定する
-
- ここではリンクの末尾が/helloの時、helloアプリケーションを動かすよと言っている
-
- Djangoの動く流れ
プロジェクトのルーティング→アプリのルーティング(動かす関数を指定)→指定された動作が実行される
helloの中にurls.pyというファイルを作る
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
-
- アプリケーションのルーティング
path(”, views.index, name=’index’),で、どのファイルのどの関数が、どの場合に動作するかを指示している
”はアドレスを指定している、今回は何も無いので/helloで動く。もし何か入れれば/hello/~~って感じのアドレスで動く。<int:question_id>/というものをここに入れる事も有るのだが、ちょい難しいので割愛
views.indexでviewsのindexって関数を動かすよと宣言
一応その動きにname=’index’ってやつで属性付けしておく
# ここを見つけて書き足す!
INSTALLED_APPS = [
'hello.apps.HelloConfig', # これを付け足す!
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
-
- どのクラスを参照するか設定している
-
- アプリケーション名がbbsならbbs.apps.BbsConfigみたいな感じで書く
- このBbsConfigの所はアプリケーションのapps.pyからclass ~~Configってなってる所をペーストする
# プロジェクトのディレクトリに戻って...
$ cd myapp
# Djangoを起動!
$ python manage.py runserver
- Flaskと比べると嫌になる程複雑だ…
5.调用模板(HTML)
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# <---DIRSの中身書き込む--->
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
],
# <---ここまでの中身ね--->
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
-
- テンプレート(html)をviews.pyから呼び出して使用する
-
- テンプレートは取り敢えずアプリケーション直下にtemplatesってディレクトリを作り、その中にアプリケーション名ディレクトリ作成、そして中にテンプレートの配置が良い
- Flaskと同じ様にtemplatesの中身にしか反応しないっぽい
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return render(request, 'hello/index.html')
return render()の中にPATHを入れる事でhtmlを指定できる
<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
<body>
<p>Hello WoWWoW</p>
</body>
</html>
index.htmlは取り敢えず普通に書いてもよろしい
実行結果でHello WoWWoWと表示されれば完了
从py端传输数据到模板。
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
context = {
'message': 'Hello World',
'players': ['勇者', '戦士', '魔法使い', '忍者']
}
enemy = "スライム"
return render(request, 'hello/index.html', context ,enemy)
-
- こんな感じで渡したいものをreturn render()の中に入れる
- 渡すものをcontext ={ ~~ }の様に纏め、context1つのみをreturnの所に入れる裏技がある
<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
<body>
<p>{{ message }}</p>
{% for player in players %}
<p>{{ player }}はモンスターと戦った</p>
{% endfor %}
<p>{{ enemy }}</p>
</body>
</html>
{{ ~~ }}に変数名を入れる事でpy側で書いた内容を渡せる
Flaskでも書いたが、html側でpythonを使いたい時は{% ~~ %}で書く
For文やif文の場合は{% endfor %}で締めなければならない
↑ここの詳しい解説はFlask_2,3あたりのテンプレートの項目が詳しいかも
7. 最后一点
- Flaskと比べて面倒くさすぎる!