首頁  >  文章  >  web前端  >  教你如何搭建簡易網站:python開發web伺服器

教你如何搭建簡易網站:python開發web伺服器

坏嘻嘻
坏嘻嘻原創
2018-09-13 17:35:314700瀏覽

Python中有數不清的Web框架,從基本的微小架構到完整的架構,它們自有各自的優點。那麼你準備使用它來做一些web開發,但在探討細節之前,讓我們從頭開始。

目標

用現有的豐富圖片資源建立一個看圖網站

條件

開發語言:




python3
  • 庫:

    flask  :一個開源的python web伺服器框架
  • jinja2:flask預設的模板引擎
  • 編輯器:

  • 推薦pycharm

一個最簡單的web伺服器

python給我們提供了一個介面:WSGI:Web Server Gateway Interface

它只要求Web開發者實作一個函數,就可以回應HTTP請求。而不用觸到TCP連線、HTTP原始請求和回應格式。

下面實例一個最簡單的web應用:

# hello.pydef application(environ, start_response):
    start_response(&#39;200 OK&#39;, [(&#39;Content-Type&#39;, &#39;text/html&#39;)])    return [b&#39;<h1>Hello, Python web!</h1>&#39;]# server.py# 从wsgiref模块导入:from wsgiref.simple_server import make_server# 导入我们自己编写的application函数:from hello import application# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:httpd = make_server(&#39;&#39;, 8000, application)
print(&#39;Serving HTTP on port 8000...&#39;)# 开始监听HTTP请求:httpd.serve_forever()


environ:一個包含所有HTTP請求資訊的dict物件;

start_response :一個發送HTTP響應的函數。

將兩個腳本放在同一目錄下,執行server.py,造訪 http://127.0.0.1:8000 就能看到效果了。


處理url

其實web應用,就是對不同url的處理。
我們將hello.py進行修改

def application(environ, start_response):
    method = environ[&#39;REQUEST_METHOD&#39;]
    path = environ[&#39;PATH_INFO&#39;]    if method==&#39;GET&#39; and path==&#39;/&#39;:        return handle_home(environ, start_response)    if method==&#39;POST&#39; and path=&#39;/signin&#39;:        return handle_signin(environ, start_response)
...

這樣就會處理兩個url,'/'和'/signin'

當然你可以這麼一直寫下去…如果你不嫌累的話。

使用模板

既然上面的方法太累太慢,那我們學點高級的:

flask

看程式碼

from flask import Flaskfrom flask import request

app = Flask(__name__)@app.route(&#39;/&#39;, methods=[&#39;GET&#39;, &#39;POST&#39;])def home():
    return &#39;<h1>Home</h1>&#39;@app.route(&#39;/signin&#39;, methods=[&#39;GET&#39;])def signin_form():
    return &#39;&#39;&#39;<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>&#39;&#39;&#39;@app.route(&#39;/signin&#39;, methods=[&#39;POST&#39;])def signin():
    # 需要从request对象读取表单内容:
    if request.form[&#39;username&#39;]==&#39;admin&#39; and request.form[&#39;password&#39;]==&#39;password&#39;:        return &#39;<h3>Hello, admin!</h3>&#39;
    return &#39;<h3>Bad username or password.</h3>&#39;if __name__ == &#39;__main__&#39;:
    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(&#39;/&#39;, methods=[&#39;GET&#39;, &#39;POST&#39;])def home():
    path = &#39;/&#39;
    all_file = os.listdir(path)    return render_template(&#39;home.html&#39;,all_file = all_file)if __name__ == &#39;__main__&#39;:
    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(&#39;/&#39;,methods=[&#39;GET&#39;,&#39;POST&#39;])def list_all():
    path = &#39;./static/mzitu/&#39;
    all_pic = os.listdir(path)    return render_template(&#39;welcome.html&#39;,all_pic = all_pic)#具体展示图片@app.route(&#39;/<path>&#39;,methods=[&#39;GET&#39;,&#39;POST&#39;])def list_pic(path):
    #错误链接无法找到图片目录就提示错误链接
    if(path not in os.listdir(&#39;./static/mzitu/&#39;)):        return render_template(&#39;error.html&#39;)
    pic_path = &#39;./static/mzitu/&#39; + path
    all_pic = os.listdir(pic_path)    return render_template(&#39;pic.html&#39;,title = path,all_pic = all_pic)if __name__ == &#39;__main__&#39;:    #port为端口,host值为0.0.0.0即不单单只能在127.0.0.1访问,外网也能访问
    app.run(host=&#39;0.0.0.0&#39;,port=&#39;2333&#39;)
然後是模板檔

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>
###相關推薦:############Eclipse PyDev Django Mysql建構Python web開發環境_MySQL#############初入Web開發,php、python和ruby該學哪一個? ######

以上是教你如何搭建簡易網站:python開發web伺服器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn