python之web框架django

        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

  • Zend framework
  • CakePHP
  • Yii
  • ThinkPHP
  • symfony
  • kohanaphp
  • Seagull
  • Drupal
  • CodeIgniter

Python

  • django
  • pinax
  • Grok
  • Pylons
  • TurboGears
  • web2py
  • Zope
  • Quixote
  • snakelets
  • snakelets
  • PylonsHQ
  • Tornado

javascript

  • jQuery
  • MooTools
  • prototype
  • dojo
  • zk
  • Backbone.js
  • SproutCore
  • Sammy.js
  • Spine.js
  • Cappuccino
  • Knockout.js
  • Javascript MVC
  • GWT(Google Web Toolkit)
  • Google Closure
  • Ember.js
  • Angular.js
  • Batman.js
  • ExtJS

JAVA

  • Spring
  • Hibernate
  • Grails
  • Tapestry
  • ZK
  • SpringMVC
  • Struts2
  • Struts
  • Mybatis

Ruby

  • Ruby On Rails
  • Sinatra

.net

  • mvc
  • 三層
  • nhibernate

下面就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 基礎教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章