目標
用已有的豐富圖片資源建一個看圖網站
python3
flask :一個開源的python web服務器框架
jinja2:flask默認的模板引擎
推薦pycharm
python給我們提供了一個接口:WSGI:Web Server Gateway Interface
它只要求Web開發者實現一個函數,就可以響應HTTP請求。而不用觸到TCP連接、HTTP原始請求和響應格式。
下面實例一個最簡單的web應用:
# hello.pydef application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, Python web!</h1>']# server.py# 從wsgiref模塊導入:from wsgiref.simple_server import make_server# 導入我們自己編寫的application函數:from hello import application# 創建一個服務器,IP地址為空,端口是8000,處理函數是application:httpd = make_server('', 8000, application) print('Serving HTTP on port 8000...')# 開始監聽HTTP請求:httpd.serve_forever()
environ:一個包含所有HTTP請求信息的dict對象;
start_response:一個發送HTTP響應的函數。
將兩個腳本放在同一目錄下,運行server.py,訪問 http://127.0.0.1:8000 就能看到效果了。
其實web應用,就是對不同url的處理。
我們將hello.py進行修改
def application(environ, start_response): method = environ['REQUEST_METHOD'] path = environ['PATH_INFO'] if method=='GET' and path=='/': return handle_home(environ, start_response) if method=='POST' and path='/signin': return handle_signin(environ, start_response) ...
這樣就會處理兩個url,’/’和’/signin’
當然你可以這么一直寫下去…如果你不嫌累的話。
既然上面的方法太累太慢,那我們學點高級的:
flask
看代碼
from flask import Flaskfrom flask import request app = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def home(): return '<h1>Home</h1>'@app.route('/signin', methods=['GET'])def signin_form(): return '''<form action="/signin" method="post"> <p><input name="username"></p> <p><input name="password" type="password"></p> <p><button type="submit">Sign In</button></p> </form>'''@app.route('/signin', methods=['POST'])def signin(): # 需要從request對象讀取表單內容: if request.form['username']=='admin' and request.form['password']=='password': return '<h3>Hello, admin!</h3>' return '<h3>Bad username or password.</h3>'if __name__ == '__main__': app.run()
注意,這個是單文件。
來分析這個腳本:
Flask通過Python的裝飾器在內部自動地把URL和函數給關聯起來。
啟動運行后,我們訪問
‘/’,看到的頁面是一個“HOME”單詞
‘/signin’,此刻是通過GET訪問,看到的是一個表單,填寫’admin’和’password’,點擊登錄 ——>
‘/signin’,此刻是通過POST訪問,看但的是Hello, admin!或者Bad username or password.
對于不了解GET與POST和HTML表單的同學,推薦去學習html基礎。
但這樣還是有些不靈活,用戶訪問看到的內容需要全部寫出來,不能復用,太麻煩
模板解決了我們上面的問題。先看一段代碼
from flask import Flask, request, render_templateimport os app = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def home(): path = '/' all_file = os.listdir(path) return render_template('home.html',all_file = all_file)if __name__ == '__main__': app.run()
這里讀取了根目錄下所有文件的名字,將其傳給html模板頁面
然后,在.py的同目錄下建立目錄templates,這里存放的是我們的模板,模板的特殊在于可以使用python指令及變量在html里
home.html
{% for i in all_file %} <a href="/page/{{ i }}">{{ i }}</a>{% endfor %}
{% %} 中寫的是指令
{{ }} 中寫的是變量
所以最終的結果是,會生成多個標簽,標簽的名字就是目錄名。
以上基礎教程參照廖雪峰。
那么,基礎已經將完了,接下來就會是成品了:
用我們上次爬取的圖片來建站,good idea!
這里在.py腳本同目錄下建立一個static目錄存放圖片。(圖片放在.py所在目錄外層會鏈接不到)
#beautiful_pic.pyfrom flask import Flaskfrom flask import requestfrom flask import render_templateimport os app = Flask(__name__)#顯示所有文件夾@app.route('/',methods=['GET','POST'])def list_all(): path = './static/mzitu/' all_pic = os.listdir(path) return render_template('welcome.html',all_pic = all_pic)#具體展示圖片@app.route('/<path>',methods=['GET','POST'])def list_pic(path): #錯誤鏈接無法找到圖片目錄就提示錯誤鏈接 if(path not in os.listdir('./static/mzitu/')): return render_template('error.html') pic_path = './static/mzitu/' + path all_pic = os.listdir(pic_path) return render_template('pic.html',title = path,all_pic = all_pic)if __name__ == '__main__': #port為端口,host值為0.0.0.0即不單單只能在127.0.0.1訪問,外網也能訪問 app.run(host='0.0.0.0',port='2333')
然后是模板文件
welcome.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>歡迎來到福利頁面</title></head><body> {% for i in all_pic: %} <a href="/{{i}}">{{i}}</a> <br><br> {% endfor %}</body></html>
pic.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>{{ title }}</title></head><body> {% for i in all_pic %} <img src="./static/mzitu/{{title}}/{{i}}" alt="{{i}}"> <br> {% endfor %}</body></html>
error.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>出錯了</title></head><body> 你要訪問的頁面不存在... <br> <a href="/">點此返回首頁</a></body></html>
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com