HTTP協議 |
Natwork 相應狀態css
響應狀態碼含義
1XX 服務器已經成功接受到你的數據正在處理,你能夠繼續提交其餘數據
2XX 請求成功 服務器已經將你請求的數據發送給你了
3XX 重定向
4XX 請求資源不存在
5XX 服務器錯誤html
請求體數據前端
動態網頁/靜態網頁python
靜態網頁:
頁面上的數據都是寫死的,萬年不變
動態網頁:
頁面上的數據是從後端動態獲取的
好比後端獲取當前時間
後端獲取數據庫數據而後傳遞給前端頁面mysql
模板渲染與模板語法jquery
後端生成的數據直接傳遞給前端頁面使用(而且前端頁面能夠靈活的操做改數據) >>> 模板語法
模板渲染 模板語法須要依賴於第三方模塊web
模板語法{{ }}sql
<table class="table table-hover table-striped table-bordered"> <thead> <tr> <th>id</th> <th>name</th> <th>password</th> </tr> </thead> <tbody> {% for user in user_dic %} <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> <td>{{ user.password }}</td> </tr> {% endfor %}
簡易版的WAB框架 |
Web框架(Web framework)是一種開發框架,用來支持動態網站、網絡應用和網絡服務的開發。這大多數的web框架提供了一套開發和部署網站的方式,也爲web行爲提供了一套通用的方法。web框架已經實現了不少功能,數據庫
開發人員使用框架提供的方法而且完成本身的業務邏輯,就能快速開發web應用了。瀏覽器和服務器的是基於HTTP協議進行通訊的。也能夠說web框架就是在以上十幾行代碼基礎張擴展出來的,有不少簡單方便使用的方法,大大django
提升了開發的效率。
python三大主流web框架
Django:大而全,自帶了不少功能模塊,相似於航空母艦 (缺點:有點笨重)
Flask:短小精悍,自帶的功能模塊特別少,大部分都是依賴於第三方模塊(小而輕)
Tornado:異步非阻塞 主要用在處理高io 多路複用的狀況 能夠寫遊戲後端
a:socket
b:路由與視圖函數
c:模板渲染
Django:
a用的別人的 wsgiref
b本身寫的
c本身寫的
Flask:
a用的別人的 werkzeug
b本身寫的
c用的別人的 jinja2
Tornado:
a,b,c都是本身寫的
框架結構圖
手擼web框架
import socket """ 請求首行 b'GET / HTTP/1.1\r\n 請求頭(一大堆kv鍵值對) Host: 127.0.0.1:8080\r\n Connection: keep-alive\r\n Upgrade-Insecure-Requests: 1\r\n User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n Accept-Encoding: gzip, deflate, br\r\n Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n \r\n 請求體 ' """ server = socket.socket() # 不傳參數默認就是TCP協議 server.bind(('127.0.0.1',8080)) server.listen(5) while True: conn, addr = server.accept() # 阻塞 等待客戶端連接 data = conn.recv(1024) conn.send(b'HTTP/1.1 200 OK\r\n\r\n') print(data) # 手動處理http數據獲取用戶訪問的路徑 current_path = data.decode('utf-8').split('\r\n')[0].split(' ')[1] if current_path == '/index': # 路由匹配上以後返回index # conn.send(b'<h1>index</h1>') with open('index.html','rb') as f: conn.send(f.read()) else: # 當匹配不上的時候統一返回404 conn.send(b'404') conn.close()
Web Server Gateway Interface。wsgiref模塊就是python基於wsgi協議開發的服務模塊,它可以很好的處理請求和相應數據,例如服務端獲取用戶請求,此模塊能夠將複雜的http協議請求,優化爲字典形式,方便後端取值,相應的結果只要交給它就能夠返回給瀏覽器
from wsgiref.simple_server import make_server from urls import * def run(env,response): """ :param env: 請求相關的信息 :param response: 響應相關的信息 :return: """ print(env) # 是一個大字典 裏面裝了一堆處理好了的鍵值對數據 response('200 OK',[('username','jason'),('password','123')]) # 固定寫法 後面列表裏面一個個元祖會以響應頭kv鍵值對的形式返回給客戶端 # 獲取用戶訪問的路徑 current_path = env.get('PATH_INFO') # if current_path == '/index': # return [b'index'] # elif current_path == '/login': # return [b'login'] # 定義一個存儲函數名的變量名 func = None # 循環比對路由與試圖函數的映射關係 for url_map in urls: # url_map = ('/index',index) if current_path == url_map[0]: func = url_map[1] # 只要匹配成功 直接結束循環 break if func: res = func(env) else: res = error(env) return [res.encode('utf-8')] if __name__ == '__main__': server = make_server('127.0.0.1',8080,run) server.serve_forever()
url(請求映射響應的文件)
from views import * urls = [ ('/index',index), ('/login',login), ('/reg',reg), ('/get_time',get_time), ('/get_user',get_user), ('/get_db',get_db), ]
view 視圖文件,相應函數文件,此時須要藉助一個jinja2 渲染模塊,由於這些函數的工做就是將後端數據插入到html文檔中,此時jinja2模塊能很好的解決這個問題,使用它在html中取數據就像操做一個對象同樣簡單。
import time from jinja2 import Template import pymysql def index(env): return 'index' def login(env): return 'login' def reg(env): return 'reg' def get_time(env): # 先獲取當前時間 current_time = time.strftime('%Y-%m-%d %X') # 打開html文件讀取內容返回給客戶端 with open(r'templates/get_time.html','r',encoding='utf-8') as f: data = f.read() # 由於是以r模式打開的文件,全部獲取到的內容就是一堆字符串 res = data.replace('@@time@@',current_time) # 字符串的替換 return res def get_user(env): with open(r'templates/get_user.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) # 將字典傳遞給前端頁面 前端經過變量名user_dic就能夠獲取到該字典 return tmp.render(user_dic={'name':"jason",'password':'123'}) def get_db(env): # 鏈接數據庫 獲取數據 渲染到前端頁面 conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123', database = 'day54', charset = 'utf8', autocommit = True ) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.execute('select * from userinfo') user_dict= cursor.fetchall() # [{},{},{},{}] with open(r'templates/get_db.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) return tmp.render(user_dict=user_dict) def error(env): return '404 error'
html 文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> @@time@@ </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <p>{{ user_dic }}</p> <p>{{ user_dic.name }}</p> <p>{{ user_dic['password'] }}</p> <p>{{ user_dic.get('name') }}</p> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <table class="table table-hover table-striped table-bordered"> <thead> <tr> <th>id</th> <th>name</th> <th>password</th> </tr> </thead> <tbody> {% for user in user_dict %} <!--[{},{},{},{}]--> <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> <td>{{ user.password }}</td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> {{ user_dict }} <!--[{},{},{},{}]--> </body> </html>
Django框架 |
Diango下載
推薦下載1.11.11版本
命令行直接下載
pip3 install django==1.11.11
pycharm下載
驗證是否下載成功
django-admin
建立django項目的方式
方式1(命令行建立):
建立django項目
django-admin startproject 項目名
建立app應用
python3 manage.py startapp app01
啓動django項目
python3 manage.py runserver
ps:用命令行建立django默認不會自動建立templates文件夾
須要你手動本身建立(注意改文件夾路徑是否被添加配置文件中)
方式2(pycharm建立)
FILE >>> new project 選擇第二個django 須要注意名字不能有中文,選擇本地的解釋器,勾選後臺管理
建立app
pycharm命令行建立
python3 manage.py startapp app01
Tools下面run manage task功能欄
啓動點小綠色箭頭
新建DJANGO項目
手動添加的templates html文件夾須要手動添加到配置文件
強調:
1.用django必定要保證只有一個在運行狀態 切記切記!!!!!!!
2.必定記得清瀏覽器的緩存
app(應用)的概念
一個django項目就是一所大學
app就是大學裏面的學院
注意新建立的app須要在配置文件中註冊才能生效(*******************)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config' # 能夠用全稱
'app01' # 也能夠簡寫
]
django各個文件的做用
應用名
migrations 數據庫遷移記錄相關數據
admin.py django後臺管理相關
models.py 模型表相關
views.py 視圖函數相關
項目名
settings.py 配置文件
urls.py 路由與視圖函數的映射關係
templates
項目用到的全部的html文件
manage.py
django入口文件
Django小白必會三板斧
from django.shortcuts import render,HttpResponse,redirect
HttpResponse 返回字符串
render 返回一個html頁面
兩種給前端頁面傳值的方式
def reg(request):
user_dict = {'name':'jason','password':'123'}
return render(request,'reg.html',{'user_dict':user_dict})
def reg(request):
user_dict = {'name':'jason','password':'123'}
return render(request,'reg.html',locals())
redirect 重定向