wegiref模塊, 安裝django, python三大主流web框架

[TOC]html

手寫簡易web框架

import socket

server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)

spe_conn, address = server.accept()  # 阻塞態

data = spe_conn.recv(1024)
data_str = data.decode('utf8')

current_path = data_str.split('\r\n')[0].split(' ')[1]

spe_conn.send(b'HTTP/1.1 200 ok\r\n\r\n')

if current_path == '/index':
    with open(r'手寫web前端頁面.html', 'rb') as fr:
        spe_conn.send(fr.read())

elif current_path == '/login':
    spe_conn.send(b'login')

else:
    spe_conn.send(b'404 error')

spe_conn.close()

基於wsgiref模塊寫web框架

ValueError

  1. [{'xxx': 'jason'}], not enough values to unpack(expect 2, got 1)
  2. ['xxx', 'jason'], too many values to unpack (expect 2)
  3. [('xxx', 'jason'), ]

views.py

存放函數, 這些函數被稱爲視圖函數, 視圖層前端

urls.py

存放路由後綴與視圖函數的對應關係, 路由層python

templates文件夾

存放html模板文件mysql

動靜態網頁

  • 靜態頁面, 數據在html頁面上是寫死的, 不會發生任何改變
  • 數據是實時獲取的, eg: 1. 後端代碼動態獲取當前時間; 2. 數據是從數據庫中查詢出來的
  • 後端數據-->html頁面-->前端-->瀏覽器渲染

jinja2模板語法

  • 專門用來出來後端數據與html頁面的交互
  • 模板語法: 可以在html頁面上, 用相似於python的語法操做後端傳遞過來的數據
def get_user_dic(env):
    from jinja2 import Template
    user_dic = {'user_name': 'jason', 'hobby': ['read', 'book', 'run']}
    with open(r'templates/get_user_dic.html', 'r', encoding='utf8') as fr:
        data = fr.read()  # 在內存中讀取HTML模板

    temp = Template(data)  # 獲得temp對象
    res = temp.render(userDic=user_dic)  # 根據HTML模板中的模板語法, 將user_dic渲染到HTML模板中, 在內存中生成一個完整的HTML文件(即res)
    # print(res)
    return res

'''
res對應整個html頁面在內存中渲染後的結果

模板語法部分對應結果:
<p>{'user_name': 'jason', 'hobby': ['read', 'book', 'run']}</p>
<p>jason</p>
<p>['read', 'book', 'run']</p>
<p>read</p>
<p>book</p>
<p>run</p>
'''
<!--模板語法-->
<p>{{userDic}}</p>
<p>{{userDic.user_name}}</p>
<p>{{userDic['hobby']}}</p>
<p>{{userDic.get('hobby').0}}</p>
<p>{{userDic.get('hobby').1}}</p>
<p>{{userDic.get('hobby').2}}</p>

基於jinjia2數據庫中的數據

  • pymysql.connect-->Connect-->__init__web

  • 模板的渲染: 將後端處理好的數據, 在內存中讀取HTML模板, 並經過jinjia2模板語法生成一個完整的HTML文件的過程sql

  • 模板的渲染是在後端完成的, 與前端無關數據庫

  • pymsql複習django

    import pymysql
    
    client = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='Cql123456',
        db='django',
        charset='utf8',
        autocommit=True
    )
    cursor = client.cursor(pymysql.cursors.DictCursor)  # 將查詢出的數據組織成一個字典
    sql = "select id, username, password from user_info"  # 當數據量特別大時, *會下降查詢效率
    affect_rows = cursor.execute(sql)  # sql注入: 利用mysql註釋語法鑽漏洞, 關鍵數據交給execute拼接
    user_lt = cursor.fetchall()

python三大主流web框架

web框架請求流程圖

python三大主流web框架

django:flask

  • 優勢: 大而全, 自帶的組件和功能很是多, 相似於航空母艦
  • 缺點: 寫小項目是可能會大材小用
  • socket部分用的wsgiref, 路由匹配和模板語法本身寫的

flask:後端

  • 優勢: 小而精, 更多依賴於第三方組件, 相似於遊騎兵
  • 缺點: 受限於第三方模塊的影響比較大
  • 若是將flask全部第三方模塊加起來, 可以直接蓋過django
  • socket部分用的werkzeug, 路由匹配本身寫的, 模板語法用的jinjia2

tornado:

  • 異步非阻塞, 經過回調函數處理異步任務結果, tornado甚至能夠用來開發遊戲服務器
  • socket, 路由匹配和模板語法都是本身寫的

django安裝

安裝django注意事項

  1. 計算機名稱不能有中文
  2. python解釋器不要使用3.7, 推薦版本3.4~3.6
  3. 一個pycharm窗口, 只跑一個django項目
  4. django版本以1.11.11爲主
  5. 驗證django是否安裝成功: 在cmd中執行django-admin, 看是否有反應

命令行建立django項目

  1. 建立django項目: django-admin startproject 項目名

  2. 啓動django項目: manage.py runserver127.0.0.1:8080

  3. app: django是一個以開放app爲主要功能的web框架

    一個django項目相似於一所大學, 而app相似於大學裏的學院

    能夠根據功能的不一樣開放多個app, 一個app對應一個具體的功能模塊

    建立app: python manage.py startapp app名

  4. 不會自動建立templates文件夾, 建立後手動將templates文件夾路徑添加到settings.py中

    settings-->TEMPLATES-->'DIRS': [os.path.join(BASE_DIR, 'templates')]

pycharm建立django項目

1.建立的app須要在django配置文件中註冊才能生效: 'INSTALLED_APPS = [..., app02.apps.App02Config'] 經過反射找到所建立的app

2.必定要確保同一個端口同一時間只能啓一個django項目

3.更改使用的數據庫, settings-->DATABASES

django文件功能

django項目名

  • 項目同名的文件夾
    • settings.py: 配置文件
    • urls.py: 路由與視圖函數對應關係
  • manage.py: django的入口文件
  • 應用名文件夾
    • migrations文件夾: 全部數據庫相關的操做記錄
    • admin.py: django中admin後臺管理
    • apps.py: 註冊app使用
    • models.py: 存放數據庫相關的模型表類
    • test.py: 測試文件
    • views.py: 處理業務邏輯的視圖函數

django小白必會三板斧

  • HttpResponse: 返回字符串

    def index(request):  # 參數request <==> env, 必須傳
        return HttpResponse('一臉懵逼')
  • render: 返回HTML文件, 能夠給HTML文件傳值

    def login(request):
        user_dic = {'username': 'jason', 'password': '123'}
        return render(request, 'login.html', {'userDic': user_dic})
  • redirect: 重定向, 1. 直接寫本網站的路徑後綴; 2. 寫其餘網站全路徑

    def home(request):
        return redirect('/login')
    	# return redirect('https://www.baidu.com')
  • 重啓機制: 內有檢測機制, 實時檢測全部文件的變化, 有時會產生代碼還沒寫完就自動重啓報錯的狀況, 不用管

相關文章
相關標籤/搜索