import socket server = socket.socket() 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) data = data.decode('utf-8') current_path = data.split('\r\n')[0].split(' ')[1] if current_path == '/index': # conn.send(b'<h1>hello baby!</h1>') with open('web.html','rb') as f: conn.send(f.read()) else: conn.send(b'404') conn.close()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="bootstrap-3.3.7/css/bootstrap.min.css"> <script src="bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <h1>Hello World</h1> </body> </html>
from wsgiref.simple_server import make_server from urls import urls from views import * def run(env,response): print(env) # 是個字典類型 # 固定寫法 response('200 OK',[]) # 列表裏面放的是請求首行的信息,能夠不放,可是必須寫 # 獲取當前用戶訪問路徑 current_path = env.get('PATH_INFO') # 定義一個函數標誌位 func = None for url_list in urls: # urls:[[],[],[]] url_list:['',func] if current_path == url_list[0]: func = url_list[1] # 結束for循環了 break if func: res = func(env) else: # 匹配不上 走error res = error(env) return [res.encode('utf-8')] if __name__ == '__main__': server = make_server('127.0.0.1',8888,run) server.serve_forever()
from views import * urls = [ ['/index',index], ['/login',login], ['/reg',reg], ['/get_time',get_time], ['/xxx',get_user], ['/get_db',get_db_info] ]
from datetime import datetime from jinja2 import Template import pymysql def index(env): with open('templates/index.html','r',encoding='utf-8') as f: data = f.read() return data def login(env): return 'login' def error(env): return '404 error' def reg(env): return 'reg' def get_time(env): ctime = datetime.now().strftime('%Y-%m-%d %X') # 打開文件 with open('templates/get_time.html','r',encoding='utf-8') as f: data = f.read() res = data.replace('@@time@@',ctime) return res def get_user(env): user = {'name':'jason','age':'18'} with open('templates/get_user.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) res = tmp.render(data=user) return res def get_db_info(env): conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123321', database = 'test007', charset = 'utf8', autocommit = True ) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.execute('select * from userinfo') user_list = cursor.fetchall() # 打開文件渲染到前端頁面 with open('templates/get_db_user.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) res = tmp.render(user_list=user_list) return res
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <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"> <table class="table table-bordered table-hover table-striped"> <thead> <tr> <th>id</th> <th>name</th> <th>age</th> </tr> </thead> <tbody> {% for data in user_list %} <tr> <td>{{data.id}}</td> <td>{{data.name}}</td> <td>{{data.age}}</td> </tr> {% endfor %} </tbody> </table> </div> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="bootstrap-3.3.7/css/bootstrap.min.css"> <script src="bootstrap-3.3.7/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.3.1/jquery.min.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="bootstrap-3.3.7/css/bootstrap.min.css"> <script src="bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <h1>{{ data }}</h1> <h1>{{ data.name }}</h1> <h1>{{ data['name'] }}</h1> <h1>{{ data.get('name') }}</h1> <h1>{{ data.age }}</h1> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="bootstrap-3.3.7/css/bootstrap.min.css"> <script src="bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <h1>index</h1> </body> </html>
瀏覽器發送二進制遵循http協議的數據,服務器接收先url匹配,在執行視圖函數,視圖函數中調用模版和數據庫數據渲染。css
""" a:socket通訊 b:路由與視圖 c:模版渲染 django:a用的別人的wsgiref,b:本身寫的,c:本身寫的 flask:a用的別人的werkzeug,b:本身寫的,c:用了別人的jinja2 tornado:a本身寫的,b:本身寫的,c:本身寫的 """
#注意事項: - django安裝版本建議1.11左右 - 計算機名稱不能是中文(尤爲要注意),更名重啓便可! - django安裝命令pip install django==1.11.11 - 文件夾不要再以dayxx多層疊加,一個項目就是一個單獨的pycharm窗口 命令行建立django項目 django-admin startproject mysite 命令行建立app python manage.py startapp 應用名 命令行啓動django python manage.py runserver 用命令行建立的時候,默認沒有templates文件夾,須要你本身手動建立 而且在settings配置文件中寫上路徑 pycharm下載 點加號 選版本 建立new project選第二個django項目(選本機環境,暫時不要選虛擬環境) 兩種建立app的方式: python manage.py startapp 應用名 tools下面的run manage.py 可以簡寫並自動提示 運行方式 python manage.py runserver pycharm自動啓動
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, "template")], # template文件夾位置 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), # 靜態文件存放位置 ]
app01 migrations #數據庫遷移記錄相關 models.py #orm模型類 views.py #視圖函數 templates #放html文件 manage.py # 管理文件 mysite # 項目目錄 __init__.py settings.py # 配置 urls.py # 路由 --> URL和函數的對應關係 wsgi.py # runserver命令就使用wsgiref模塊作簡單的web serve