目錄css
在咱們的認知中python被稱做調包俠,你知道這個嘛,就是由於在python中基本全部的事情均可以調用第三方寫好的模塊。html
首先說一下軟件開發架構:前端
c/s 客戶端 服務端python
b/s 瀏覽器端 服務端mysql
ps:b/s本質上也是c/sjquery
http是超文本傳輸協議web
2xx 請求成功。sunccess(成功狀態碼)請求正常處理完畢sql
4xx 請求錯誤(404:請求資源不存在,403:拒絕訪問),client Error(客戶端錯誤狀態碼),服務器沒法處理請求數據庫
#Author:SkyOcean # @Time :2019/10/1821:31 # @Author :SkyOcean # @Site : # @File :手擼.py # @Software :PyCharm import socket server = socket.socket() server.bind(('127.0.0.1',8080)) server.listen(5) while True: conn,add = server.accept() data = conn.recv(1024) # print(data) conn.send(b'HTTP/1.1 200 ok\r\n\r\n') data=data.decode("utf-8") current_path = data.split("\r\n")[0].split(' ')[1] if current_path=='/index': conn.send(b'index') elif current_path=='/login': conn.send(b'login') else: conn.send(b'404 errror')
該模塊實現了上面倆個手動的過程django
from wsgiref.simple_server import make_server from urls import urls from views import * def run(env,response): """ :param env: 請求相關的全部數據 :param response: 響應相關的全部數據 :return: """ response('200 OK',[]) # print(env) current_path = env.get('PATH_INFO') # if current_path == '/index': # # 不少業務邏輯代碼 # return [b'index'] # elif current_path == '/login': # return [b'login'] # else: # return [b'404 error'] # 先定義一個變量名 用來存儲後續匹配到的函數名 func = None # for循環 匹配後綴 for url in urls: if current_path == url[0]: func = url[1] # 一旦匹配成功 就將匹配到的函數名賦值給func變量 break # 主動結束匹配 # 判斷func是否有值 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) # 實時監聽該地址 只要有客戶端來鏈接 統一交給run函數去處理 server.serve_forever() # 啓動服務端
根據功能不一樣拆分紅了不一樣的py文件
urls.py 路由與視圖函數對象關係
from views import * urls = [ ('/index',index), ('/login',login), ('/xxx',xxx), ('/get_time',get_time), ('/get_user',get_user), ('/get_db',get_db), ]
views.py 放的是視圖函數(函數,類)(處理業務邏輯的)
def index(env): return 'index' def login(env): return 'login' def error(env): return '404 error' def xxx(env): return 'xxx' from datetime import datetime def get_time(env): current_time = datetime.now().strftime('%Y-%m-%d %X') with open(r'D:\上海Python11期視頻\python11期視頻\day56\templates\get_time.html','r',encoding='utf-8') as f: data = f.read() data = data.replace('$$time$$',current_time) return data from jinja2 import Template def get_user(env): d = {'name':'jason','pwd':'123','hobby':['read','running','music']} with open(r'D:\上海Python11期視頻\python11期視頻\day56\templates\get_user.html','r',encoding='utf-8') as f: data = f.read() temp = Template(data) res = temp.render(user=d) # 將字典d傳遞給前端頁面 頁面上經過變量名user就可以獲取到該字典 return res import pymysql def get_db(env): conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = 'root', database = 'day56', charset = 'utf8', autocommit = True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = "select * from userinfo" cursor.execute(sql) res = cursor.fetchall() print(res) with open(r'D:\上海Python11期視頻\python11期視頻\day56\templates\get_db.html','r',encoding='utf-8') as f: data = f.read() temp = Template(data) ret = temp.render(user_list = res) # 將字典d傳遞給前端頁面 頁面上經過變量名user就可以獲取到該字典 return ret
templates 模板文件夾(用來存放一堆html文件)
<!--get_time.html--> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <titget_timele>Title</titget_timele> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> </head> <body> $$time$$ </body> </html>
<!--get_user.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.3.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> </head> <body> <p>{{ user }}</p> <p>{{ user.name }}</p> <p>{{ user['pwd'] }}</p> <p>{{ user.get('hobby') }}</p> </body> </html>
<!--get_db.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.3.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h1 class="text-center">用戶列表</h1> <table class="table table-bordered table-striped table-hover"> <thead> <tr> <th>id</th> <th>name</th> <th>pwd</th> </tr> </thead> <tbody> {% for user_dict in user_list %} <tr> <td>{{ user_dict.id }}</td> <td>{{ user_dict.name }}</td> <td>{{ user_dict.pwd }}</td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </html>
拆分完成後,添加功能只須要在urls.py和views.py方面修改就行
靜態網頁
數據是寫死的 萬年不變
動態網頁
數據是實時獲取的
eg:
1.後端獲取當前時間展現到前端
2.後端獲取數據庫中的數據展現到前端
疑問:
如何將後端獲取的數據 傳遞給html頁面
後端獲取的數據 傳遞給html頁面 >>>: 模板的渲染 jinja2 pip3 install jinja2
在前端字典的使用
模板語法(極其貼近pythaon後端語法) <p>{{ user }}</p> <p>{{ user.name }}</p> <p>{{ user['pwd'] }}</p> <p>{{ user.get('hobby') }}</p>
在前端數據庫的使用
模板語法(極其貼近pythaon後端語法) {% for user_dict in user_list %} <tr> <td>{{ user_dict.id }}</td> <td>{{ user_dict.name }}</td> <td>{{ user_dict.pwd }}</td> </tr> {% endfor %}
他們涉及到三個領域
A:socket部分
B:路由和視圖函數對應關係
C:模板語言
Django:
A:用別人的 wsgiref模塊
B: 本身寫的
C:本身寫的
Flask:
A:用別人寫的 werkzeug模塊(基於wsgiref模塊)
B:本身寫的
C:用別人的 jinja2
Tornado
三個都是本身寫的
1.X 版本 2.X版本 如今市面上用的比較多的仍是1.X
推薦你使用1.11.9~1.11.13
下表中LTS 表示還在維護的版本
直接安裝最新版本:pip3 install django
選擇版本:pip3 install django==1.11.11
驗證django是否安裝成功:
命令行輸入diango-admin
一個django項目就相似因而一所大學,而app就相似於大學裏面的學院
django其實就是用來一個個應用的
一個app就至關於一塊獨立的功能,好比:用戶功能 管理功能
django支持任意多個app
首先切換到要建立的文件下,而後建立django項目:django-admin startproject 項目名
,如django-admin startproject mysite
啓動django項目:python manage.py runserver IP和端口號
,如:python manage.py runserver 127.0.0.1:8080
,不輸入ip和端口號默認開啓本機,如python manage.py runserver
建立應用app:python manage.py startapp app名
,如python manage.py startapp app01
注意:
新建立的app須要你去settings配置文件中進行註冊,若是是pycharm只會幫助你註冊第一個在你建立項目的時候寫的應用,建立第二的app 的時候須要本身進行配置。
注意:
os.path.join(BASE_DIR,'templates')
命令行關閉直接退出
建立django項目
在啓動django項目的時候 你必定要確保一個端口只有一個django項目
項目名(mysite) (mysite)跟項目名同名的文件夾:項目目錄 __init__.py settings.py 暴露給用戶的配置文件 urls.py 路由與視圖函數對應關係 wsgi.py runserver命令就使用wsgiref模塊作簡單的web server 應用名(app) migrations文件夾 存放數據庫遷移記錄的 admin.py django後臺管理 apps.py 註冊相關 models.py 模型類 tests.py 測試文件 views.py 存放視圖函數 templates文件夾 存放html文件 manage.py django入口文件,管理文件
[TOC]
第一步配置文件中配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 指定數據庫 MySQL postgreSQL 'NAME': 'day56', # 到底使用哪一個庫 'USER':'root', 'PASSWORD':'root', 'HOST':'127.0.0.1', 'PORT':3306, 'CHARSET':'utf8'#編碼 } } 第二步 django默認使用的是mysqldb鏈接數據庫 可是該模塊不支持了 因此你要告訴django不要用mysqldb該用pymysql鏈接 你能夠在項目名下面的__init__.py也能夠在應用名下面的__init__.py文件中指定 import pymysql pymysql.install_as_MySQLdb()
Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.
若是出現時區錯誤的話,有倆種不過方法
jdbc:mysql://localhost:3306?serverTimezone=GMT
在URL的後面添加?serverTimezone=GMT,可是比較麻煩,每次都要進行配置時區,建議採用方法二
一共兩步