Web服務器和應用服務器以及web應用框架:
web服務器:負責處理http請求,響應靜態文件,常見的有 Apache, Nginx 以及微軟的 IIS 等.
應用服務器:負責處理邏輯的服務器。比如Java、php 、Python 的代碼,是不能直接通過 Nginx 這種web服務器來處理的,只能通過應用服務器來處理,常見的應用服務器有 uwsgi 、 tomcat 等。
web應用框架:一般使用某種語言,封裝了常用的 web 功能的框架就是web應用框架, flask 、 Django 以及Java中的 SSM(Spring+SpringMVC+MyBatis) 等框架都是web應用框架。
一般開發一個web項目,首先考慮的就是web服務器架構選擇(LAMP或者LNMP等),接下來纔是針對模塊進行開發。
Web應用框架(Web application framework)是一種開發框架,用來支持動態網站、網絡應用程序及網絡服務的開發。其類型有基於請求的和基於組件的兩種框架,前者的代表有Struts和Spring MVC等,後者的成員則有JSF、Tapestry等等,常見的架構有MVC和CMS兩種。Web應用框架有助於減輕網頁開發時共通性活動的工作負荷,例如許多框架提供數據庫訪問接口、標準樣板以及會話管理等,可提升代碼的可再用性。常用的web開發框架根據不同語言羅列如下:
PHP |
|
Python |
|
javascript |
|
JAVA |
|
Ruby |
|
.net |
|
下面就python中常用的django框架進行闡述。
(1)初步瞭解Django
Django是用python語言寫的開源web開發框架,並遵循MVC設計,對比同源的Flask框架,Django原生提供了衆多的功能組件,讓開發更簡便快速。其具有以下特點,
- 封裝:大量的功能封裝
- 簡化:把相對複雜的功能進行封裝後做到簡化
- 優化:後臺py代碼優化提升效率
- 漏洞:彌補了已知網站傳輸漏洞,如sql注入
- 管理:框架以模塊劃分,分別負責不同的功能,清晰易於管理
Django遵循的MVC設計與傳統的MVC結構存在一定差異,故也常常被稱爲MTV結構
其整個流程如下,
利用django開始構建一個工程,具體操作如下,
具體的指令如下
創建項目:django-admin startproject mainproject
創建APP(進入項目目錄):python manage.py startapp firstWEB
創建庫表(進入項目目錄):python manage.py makemigrations
執行庫表建立(進入項目目錄):python manage.py migrate
啓動django項目:python manage.py runserver
模板渲染嵌入語法:在html中可以嵌入後臺語言 區分符號爲 {%命令%} {{變量}}
需要注意的是,如果想嵌入for循環,需要在結束後添加{%endfor%},如
{% for data in datas %}
<tr>
<td>{{ data.value_a }}</td>
<td>{{ data.value_b }}</td>
<td>{{ data.result }}</td>
</tr>
{% endfor %}
建好後,項目目錄如下
其結構如下(大同小異),mainproject是一個項目,firstWEB是項目下的應用之一,可以使用創建命令創建更多的應用。
- 其中mainproject項目文件夾和其下的mainproject文件夾: 執行
django-admin startproject mainproject
創建項目時自動創建 - manage.py: 同上也是執行django-admin startproject mainproject時自動創建,它是django的任務管理命令行工具。
- firstWEB文件夾和migrations文件夾: 是執行
python manage.py startapp firstWEB
創建應用時自動創建。 - db.sqlite3: 是創建應用,簡單運行後自動添加的sqlite3數據庫,在django中是默認使用這個(如需配置其配置路徑爲./my_site/settings.py)。
- mainproject中的settings.py: 這個文件中包括了項目的初始化設置,可以針對整個項目進行有關參數配置,比如配置數據庫、添加應用等。
- mainproject中的urls.py: 這是一個總的URL配置表文件,主要是將URL映射到應用程序上。當用戶請求某個URL時,django會根據這個文件夾中的映射關係指向某個目標對象,該對象可以是某個應用中的urls.py文件,也可以是某個具體的視圖函數。在django中,這個文件也被稱爲URLconf,這是django非常強大的一個特性。
- mainproject中的wsgi.py: WSGI是 Web Server Gateway Interface縮寫,它是python所選擇的服務器和應用標準,django也會使用。wsgi.py定義了我們所創建的項目都是WSGI應用。
- 如果你還看到了__pycache__文件夾: 它是執行
python manage.py runserver
命令時自動創建,它是一個編譯後的文件夾,裏面放的是一些pyc結尾的文件。 - firstWEB中的admin.py: 這個文件中可以自定義django管理工具,比如設置在管理界面能夠管理的項目,或者通過重新定義與系統管理有關的類對象,向管理功能增加新的內容。
- firstWEB中的apps.py: 這個文件時django1.10之後增加的,通常裏面包含對應用的配置。
- blog中的migration目錄: 用於存儲應用的數據表結構的指令,通過這些指令可以修改和創建數據庫,從而在models.py模型類和數據庫表之間遷移。
- firstWEB中的modles.py: 這是應用的數據類型,每個django應用都應當有一個 modles.py文件,雖然該文件可以爲空,但不宜刪除,這裏就是編寫模型類的地方。
- firstWEB中的tests.py: 在這個文件中可以編寫測試文檔來測試所建立的應用。
- firstWEB中的views.py: 這是一個重要的文件,用戶保存響應各種請求的函數或者類。如果編寫的是函數,則稱爲基於函數的視圖;如果編寫的是類,則稱之爲基於類的視圖。views.py就是保存函數或者類的視圖文件。當然也可以用其他的文件名稱,只不過在引入響應函數或者類時,要注意名稱的正確性,views.py是我們習慣使用的文件名稱。
- 配置模板的路徑,即template文件夾,這一般爲自己手動建立,可放在應用文件夾下也可以放在外面,主要用來存放前端的html文件。使用時需要在項目的setting.py文件中進行配置。
- 配置靜態目錄,即static文件夾,同樣需要手動創建,主要存放css和js這些靜態文件,在setting.py中進行設置。
(2)實例
此次實例是以b站up主的教程爲例,主要完成以下功能:
- 新建一個django工程
- 創建一個app,即生成一個網站
- 創建model,創建數據表(庫,有幾個簡單的字段)
- 創建一個渲染模板頁面並需要完成一個運算功能(加法)
- 每次運算結果保存起來
- 通過model讀取全部的運算結果
- 前端頁面呈現數據庫裏的結果
- 前端加一個清庫功能,一鍵刪除數據庫內容
》首先前期的環境準備在這裏就不贅述了,通過anaconda安裝虛擬環境和django庫,這裏我使用的是win10下python3.7,django2.2, pycharm進行開發配置的 ,接着按照上面新建項目和app的方法,對此進行一一構建,同時添加一個template文件夾,用於存放前端html文件,最後效果如下,
接下來我們需要做的是在setting.py文件中做如下修改
如果同時想要修改語言與時區,可同時在setting.py中進行如下修改
LANGUAGE_CODE = 'zh-Hans' ###en-us 修改爲中文
TIME_ZONE = 'Asia/Shanghai' ##UTC修改爲中國時間
這個時候如果無誤的話,啓動項目,在瀏覽器中輸入http://127.0.0.1:8000/會出現以下頁面,即表示初步建立成功。
》接下來,需要做的就是添加頁面與邏輯功能,同時關聯其前後端操作
首先在firstWEB文件夾下的views.py文件中,添加邏輯函數
from django.shortcuts import render
from firstWEB.models import *
from django.http import HttpResponse
# Create your views here.
def index(request):
return render(request,'index.html')
這句話就是告訴渲染index.html文件,接着在新建的template文件夾下添加一個index.html文件,裏面內容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>my first web from django</title>
</head>
<body>
<h1 style="color:red">my first django website</h1>
</body>
</html>
最後需要做的就是告訴router路由進行映射,在項目文件下的urls.py文件中添加如下內容
from django.contrib import admin
from django.urls import path ##django 1.x版本用的是url來正則匹配,後面版本直接用path來實現
from firstWEB import views
urlpatterns = [
path('admin/', admin.site.urls),
path('abc/',views.index) ###在這裏用abc還是index都行,只是用來做映射,在網頁端輸入對應即可
]
這時候在去瀏覽器中輸入http://127.0.0.1:8000/abc/,即可出現以下界面
接下來的操作同上,在views.py中分別添加計算頁與返回結果頁
def CalPage(request):
return render(request,'cal.html')
def Cal(request): ###返回結果
if request.POST:
value_a,value_b=request.POST["valueA"],request.POST["valueB"]
result=int(value_a)+int(value_b)
# print(value_a,value_b)
return render(request,'result.html',context={"data":result})
else:
return HttpResponse("please visit us with POST")
同時在template下添加cal.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>計算頁面</title>
</head>
<body>
<form method="POST" action="/cal">
{% csrf_token %}
第一個數字:<input type="number" name="valueA">
+
第二個數字:<input type="number" name="valueB">
<input type="submit" value="提交計算">
</form>
</body>
</html>
以及result.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>結果頁面</title>
</head>
<body>
<h1>計算結果是:</h1><h2>{{data}}</h2>
</body>
</html>
然後再在urls.py文件中添加對應映射即可,最後在瀏覽器中檢驗結果。
》關聯數據庫
最後假如我們想將結果寫入到數據庫中,這時候我們需要在應用項目文件夾下的models.py文件進行修改
from __future__ import unicode_literals
from django.db import models
# Create your models here.
###類似於對錶的描述
class cal(models.Model):
value_a=models.CharField(max_length=10)
value_b=models.FloatField(max_length=10)
result=models.CharField(max_length=30)
然後利用以下命令來生成數據庫
python manage.py makemigration
python manage.py migrate
這個時候打開數據庫就可以看到建好的數據庫了,然後在views.py中,我們需要將前端操作的結果寫入到數據庫中
- 在Cal函數中添加
###開始寫入sql-lite數據庫
cal.objects.create(value_a=value_a,value_b=value_b,result=result)
- 添加讀取操作和刪除操作
def CalList(request):
datas=cal.objects.all()
# for data in datas:
# print(data.value_a,data.value_b,data.result)
return render(request,'list.html',context={"datas":datas})
def DelData(request):
cal.objects.all().delete()
return HttpResponse('data deleted')
對應的在templates下添加list.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Cal list</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>valueA</th>
<th>valueB</th>
<th>result</th>
</tr>
</thead>
{% for data in datas %}
<tr>
<td>{{ data.value_a }}</td>
<td>{{ data.value_b }}</td>
<td>{{ data.result }}</td>
</tr>
{% endfor %}
</table>
<form action="del" method="POST">
{% csrf_token %}
<input type="submit" value="清庫"></input>
</form>
</body>
</html>
然後再在urls.py中添加映射即可。最後顯示的界面結果如下
點擊清庫後,數據庫清空,頁面顯示data deleted。
(3)補充點
》ORM(object relationship mapping)
表示對象-關係映射的縮寫,實際上就是一種把數據庫映射成對象的想法
- 數據庫的表(table) --> 類(class)
- 記錄(record,行數據)--> 對象(object)
- 字段(field)--> 對象的屬性(attribute)
比如說查詢語句 SELECT id, first_name, last_name, phone, birth_date, sex FROM persons WHERE id = 10
對應到代碼就是
res = db.執行數據庫(sql);
name = res[0]["FIRST_NAME"];
那麼ORM的寫法就是
p = Person.get(10);
name = p.first_name;
這樣的好處就是可以不需要了解數據庫底層,因爲它不需要接觸SQL
語句
》django
Django1.x中的正則形式去匹配鏈接,但是怎麼匹配,網頁都是彈出page not found錯誤,顯示找不到鏈接,不得已的情況下將path換爲了url發現網頁能夠正常匹配顯示。通過查閱相關文檔發現,Django2.x中的path不支持正則匹配,但在同一目錄下的re_path與Django1.x中的url功能大部分相同可以替代url。
參考鏈接:
https://blog.csdn.net/Best_fish/article/details/84307045(Django框架和Tornado框架的區別)
https://www.cnblogs.com/yangmeichong/p/11303746.html(python之Djiango框架簡介)
https://code.ziqiangxuetang.com/django/django-views-urls.html(Django 2.2 基礎教程)