包含如下知識點:
- socket
- http協議
- HTML知識
- 數據庫(pymysql,SQLAlchemy)html
博客園(socket服務端python
1.監聽IP和端口,默認80
3.收到用戶請求
4.響應用戶請求mysql
瀏覽器(socket客戶端)web
2.用戶訪問博客園,即瀏覽器輸入博客園地址www.cnblogs.com,進行DNS解析並與博客園服務器創建鏈接
5.接收博客園發送的響應信息
6.斷開鏈接sql
HTTP請求是無狀態的數據庫
靜態網站django
#!/usr/bin/env python # __Author__: "wanyongzhen" # Date: 2017/5/13 import socket sock = socket.socket() sock.bind(('127.0.0.1', 8001)) sock.listen(5) def index(request): """ 處理用戶請求,並返回響應內容 :param request: :return: """ f = open('index.html', 'rb') data = f.read() f.close() return data def article(request): f = open('article.html', 'rb') data = f.read() f.close() return data routes = [ ('/index', index), ('/article', article), ] def run(): while True: conn, addr = sock.accept() data = conn.recv(8096) data = str(data, encoding='utf8') headers,bodys = data.split('\r\n\r\n') temp_list = headers.split('\r\n') method,url,protocal = temp_list[0].split(' ') func_name = None for item in routes: if item[0] == url: func_name = item[1] break if func_name: response = func_name(data) else: response = b'404' if response == b'404': conn.send(b'HTTP/1.1 404 NOT FOUND\r\n\r\n') else: conn.send(b'HTTP/1.1 200 OK\r\n\r\n') conn.send(response) conn.close() if __name__ == "__main__": run()
動態網站flask
#!/usr/bin/env python # __Author__: "wanyongzhen" # Date: 2017/5/13 import socket import time import pymysql sock = socket.socket() sock.bind(('127.0.0.1', 8001)) sock.listen(5) def index(request): """ 處理用戶請求,並返回響應內容 :param request: :return: """ f = open('index.html', 'rb') data = f.read() f.close() return data def article(request): f = open('article.html', 'r', encoding='utf8') data = f.read() f.close() ctime = time.time() data = data.replace('@@sw@@', str(ctime)) data = bytes(data, encoding='utf8') return data def users(request): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='db02', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute('select id,name,email from users') user_list = cursor.fetchall() cursor.close() conn.close() print(user_list) content_list = [] for row in user_list: tp = '''<tr> <td>%s</td> <td>%s</td> <td>%s</td> </tr>'''%(row['id'], row['name'], row['email']) content_list.append(tp) content=''.join(content_list) f = open('users.html', 'r', encoding='utf8') template = f.read() f.close() template = template.replace('@content@', content) template = bytes(template,encoding='utf8') return template routes = [ ('/index', index), ('/article', article), ('/users', users) ] def run(): while True: conn, addr = sock.accept() data = conn.recv(8096) data = str(data, encoding='utf8') headers,bodys = data.split('\r\n\r\n') temp_list = headers.split('\r\n') method,url,protocal = temp_list[0].split(' ') func_name = None for item in routes: if item[0] == url: func_name = item[1] break if func_name: response = func_name(data) else: response = b'404' if response == b'404': conn.send(b'HTTP/1.1 404 NOT FOUND\r\n\r\n') else: conn.send(b'HTTP/1.1 200 OK\r\n\r\n') conn.send(response) conn.close() if __name__ == "__main__": run()
總結:瀏覽器
1. HTTP協議,無狀態、短鏈接 2.瀏覽器(socket客戶端) 3.本身寫網站 - a socket服務端 - b 根據URL不一樣返回不一樣的內容 - 路由系統 URL -> 函數 - c 字符串返回給用戶 - 模板引擎的渲染 - HTML充當模板(包含特殊字符) - 本身創造任意數據 4.Web框架 框架種類: - a b c Tornado - b c Django(經過wsgiref完成a功能) - b flask 另一種分類: - Django - 其餘
安裝Django框架服務器
pip3 install django
命令建立並啓動
建立Django項目
django-admin startproject mysite
目錄結構
mysite |____manage.py # 對當前Django程序全部操做能夠基於 python manage.py runserver |____mysite | |______init__.py | |____settings.py # Django的配置文件 | |____urls.py # 路由系統:url -> 函數 | |____wsgi.py # 用於定義Django用什麼實現socket服務端(wsgiref)
啓動Django項目
cd mysite python manage.py runserver 127.0.0.1:8080
訪問:http://localhost:8080/
PS: pycharm也能夠輕鬆建立
第一個Django請求
mysite/mysite/urls.py 文件 from django.conf.urls import url from django.contrib import admin from django.shortcuts import HttpResponse def login(request): """ 處理用戶請求,並返回內容 :param request: 用戶請求相關的全部信息(對象) :return: """ return HttpResponse('login') urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^login/', login), ]
Django程序建立步驟
1.建立Project
2.配置
- 模板路徑(默認便可)
- 配置靜態文件路徑
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
3.額外配置 註釋該行
# 'django.middleware.csrf.CsrfViewMiddleware',