python web 開發 - Django 入門
開篇
通過上一篇 python 入門實戰 - 學生管理系統 練習了一把 python 語法。本篇總結下 Django 這個 web 框架的入門使用。前提是要有相關的 web 開發經驗(Java, php等)。因為本文不會涉及 http 協議,前后端分離不分離等概念。
另附:
- 官方教程: https://docs.djangoproject.com/en/3.0/intro/tutorial02/
- 菜鳥教程: https://www.runoob.com/django/django-tutorial.html
正文
本人開發環境
- 操作系統: MacOS
- IDE: vscode
- 數據庫: mysql
- python 版本 3.x
準備工作
-
安裝 django (非 maOS 操作系統 請參考開篇的教程選擇安裝方式,以及驗證是否安裝成功)
python3 -m pip install django==1.11.6
-
創建項目
django-admin startproject helloworld(這個是項目名)
圖中標記了 4 個地方
1. 創建完 helloworld 項目后,會發現helloworld 下面還有一個 helloworld, 后面說到的 helloworld 一般都是第一層級,簡稱項目根目錄
2. settings.py 主要是一些配置,比如數據庫,靜態文件存放位置等
3. urls.py 主要配置 url 和 函數的映射關系
4. manage.py 提供用來管理項目的命令,比如啟動項目,后面請多留意
-
進入項目根目錄
cd helloworld
-
啟動項目,并訪問
(這里會啟動失敗,原因是 python3 和 django 的兼容問題,反正我用的 django 版本存在這個問題,解決方式就是刪除某個文件的一個 逗號,如果遇見了,百度一搜就明白了,具體內容當初忘記保存了)
python3 manage.py runserver
// 當然也可以指定ip:host
python3 manage.py runserver localhost:8080
- 至此一個 web 項目雛形已經有了
繼續完善
至此我們就可以自行開發 web 應用了,但是你也許還會問
- http 請求調用的函數寫在哪里,以及函數 和 頁面的映射關系如何體現
- 靜態文件的存放位置
下面就新建的 helloword 項目進行講解
問題 1. 函數及其映射關系
找到 helloworld/helloworld/ 下面有個 urls.py 文件
默認配置:
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
修改后:
from django.conf.urls import url
from django.contrib import admin
# 下面是新增的
from django.shortcuts import HttpResponse, render, redirect
# 1. 跳轉頁面
# render 表示 訪問 http://localhost:8000/index 會跳轉到 index.html 頁面
def index(request):
return render(request, 'index.html')
# 2. 跳轉頁面,并攜帶參數
def index02(request):
return render(request, 'index.html', {'參數名', 值})
# 3. 重定向
def index03(request):
return redirect('/index/')
# 4. 接收參數
def index04(request):
# 接收 post 請求參數
request.POST.get('參數名')
# 接收 get 請求參數
request.GET.get('參數名')
return render(request, 'index.html')
# 配置 url 映射
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 配置 url 映射
# 訪問 http://localhost:8000/index/ 就會調用上面的 index 函數
url(r'^index/', index),
# TODO 省略 index02, index03, index 04 映射配置
]
- 靜態文件存放位置
找到 helloworld/helloworld/ 下面有個 settings.py 文件
html 文件配置: 大概 50 多行的位置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 修改這個配置項如下
# 然后在項目根目錄下,新建 templates 目錄,用于存放 html 文件
'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',
],
},
},
]
css,js ,image 文件配置: 在 settings.py 文件末尾
STATIC_URL = '/static/' # 在 項目根目錄 helloworld 下面
# 當然還有別名的用法,剛開始學,多說無益
如何在 html 中引用 css,js
<!DOCTYPE html>
<html lang="en">
<head>
<script src='/static/test.js'></script>
<title>Document</title>
</head>
<body>
</body>
</html>
規范項目
上面有些寫法多為練習使用,因此不太規范。比如我們在 helloword/helloword/urls.py 寫了一大堆函數,非常不雅觀。所以現在引入一個新的東西。
-
在項目根目錄下,執行
python3 manage.py startapp app(模塊名) # 這是我們第二次使用 manage.py 這個文件, # 第一次是啟動項目,現在應該可以理解 這個文件是干嘛用的 # 執行結束,我們會發現項目根目錄下多了一個 app 目錄
-
讓 django 知道你新增的 app 模塊
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 新增 'app.apps.AppConfig' # 也可以直接寫 'app' # app 就是新增的目錄名 后面的 固定, # 你也可以打開 app/apps.py 文件,看看 ]
-
app 目錄下 有個 views.py 文件,我們可以把函數定義在這里。
from django.shortcuts import HttpResponse, render, redirect def index(request): return render(request, 'index.html')
-
然后回到 helloword/helloword/urls.py 文件中,修改后如下:
# 1. 導入函數 from app.views import index # 2. 配置 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', index), ]
附加
如何配置 mysql 數據庫
同樣找到 helloworld/helloworld/ 下面有個 settings.py 文件,大概 70-80行左右
修改后如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'student_sys', # 庫
'USER': 'root',
'PASSWORD': '123456',
'HOST': 'localhost',
'PORT': 3306
}
}
然后找到 helloworld/app/init.py 文件
文件默認是空的, 添加如下配置
import pymysql
# 告訴 django 用 pymysql 代替 mysqldb
pymysql.install_as_MySQLdb()
引入 orm
進入 helloworld/app/ 目錄找到 models.py 文件,修改如下:
from django.db import models
# 定義一個 Student 類
class Student(models.Model):
id = models.AutoField(primary_key=True) # 主鍵
name = models.CharField(max_length=20) # 字符類型
sex = models.CharField(max_length=2)
birthday = models.CharField(max_length=10)
def __str__(self):
return self.name + "\t" + self.sex + "\t" + self.birthday
在項目根目錄 helloworld 下依次執行
python3 manage.py makemigrations
python3 manage.py migrate
會自動幫我們生成表
也許你還會困惑:
- 為什么就定義了一個 model,生成了那么多表
- 修改 model 后,怎么自動更新表結構
- 如何 crud 等等
~~~~~ 請自行探索
總結
自我吐槽: 其實這樣的教程很雞肋,擔心篇幅過長看的人眼花繚亂。
- 很多地方沒有給出解釋,比如 settings.py 的一些配置,自動生成表等
- 遺留了很多問題沒有給出答案,甚至有些問題都沒在文中提到,比如,訪問頁面會出現 403,該如何解決
- 之所以沒講那么多,是覺得那些問題很容解決
寫完之后,感覺本文的定位更多的是自我總結,可能你們看到這文章會吐槽,噴我~~~
智能推薦
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
猜你喜歡
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...
19.vue中封裝echarts組件
19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...