import socket
from threading import Thread
def f1(con):
con.send(b'hello')
def f2(con):
con.send(b'thank you')
routers = {
'/faker': f1,
'/xiaohu': f2
}
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen(5)
conn, addr = sk.accept()
date = conn.recv(8096)
date = str(date, encoding='utf-8')
headers, body = date.split('\r\n\r\n')
tmp_lis = headers.split('\r\n')
meth, url, ht = tmp_lis[0].split(' ')
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
for it in routers.items():
if it[0] == url:
f = it[1]
f(conn)
sk.close()
模擬靜態網站
當服務器接受到請求後,根據不同的url可以返回不同的內容,但是這樣形成的只是靜態網站,如果想讓網站是動態的,就需要用一些特殊的字符替代html文檔中的內容,然後再替換掉即可。
返回數據庫裏的內容示例
import socket
from jinja2 import Template
import pymysql
def f1(con):
# 連接數據庫
sql_con = pymysql.connect(host="localhost", user='root', password='123456789', database='sdw', charset='utf8')
cursor = sql_con.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from dates;"
try:
cursor.execute(sql)
res = cursor.fetchall()
except:
sql_con.rollback()
sql_con.close()
# 打開文件
file = open('登錄.html', 'r', encoding='utf-8')
ff = file.read()
file.close()
# 渲染模板
temp = Template(ff)
data = temp.render(mylist=res)
print(data)
con.send(data.encode('utf-8'))
def f2(con):
pass
routers = {
'/wife': f1,
'/xiaohu': f2
}
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen(5)
conn, addr = sk.accept()
print("連接上了")
date = conn.recv(8096)
date = str(date, encoding='utf-8')
headers, body = date.split('\r\n\r\n')
tmp_lis = headers.split('\r\n')
meth, url, ht = tmp_lis[0].split(' ')
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
for it in routers.items():
if it[0] == url:
f = it[1]
print("find f1")
f(conn)
sk.close()
總結
- 開啓服務器,接收瀏覽器的請求
- 根據不同的url->執行不同的函數(路由系統)
- 將html文檔發送給瀏覽器
- 瀏覽器渲染界面呈現給用戶
web框架
Django 框架
- 安裝Django pip install Django
- 創建Django項目 Django-admin startproject Djangotest
- python manage.py runserver 127.0.0.1:8000 監聽8000端口
Django 程序目錄
- manage.py 所有的操作都居於manage
- setting.py Django的配置文件
- url.py 路由系統;url->函數
- wsgi.py 用於定義Django用socket,wsgiref,uwsgi
靜態文件配置
from django.shortcuts import render
利用render模塊,我們可以很方便的返回一個我們存放在templates下的html代碼
return render(request, "login.html")
觀察render函數的源碼可以發現這個模塊實現的功能就是自動幫我們找到存放在templates下的
html文件並且包裝成httpresponse對象返回
同樣我們也有處理靜態文件(圖片,css,js)的方法
打開setting文件
STATIC_URL = ‘/static/’
STATICFILES_DIRS = (
os.path.join(BASE_DIR, ‘static’),
)
當引入靜態文件時前綴加上/static/就會自動到靜態文件下查找引入的文件
總結:創建Django的步驟
- 創建Django project
- 2.1 配置模板路徑(render)
2.2 配置靜態文件路徑(static) - 註釋掉setting中middleware中的第三條