輕量的web框架Bottle

来源:https://www.cnblogs.com/sfencs-hcy/archive/2019/03/24/10591451.html
-Advertisement-
Play Games

簡潔的web框架Bottle 簡介 Bottle是一個非常簡潔,輕量web框架,與django形成鮮明的對比,它只由一個單文件組成,文件總共只有3700多行代碼,依賴只有python標準庫。但是麻雀雖小五臟俱全,基本的功能都有實現,很適合做一些小的web應用 開始使用 首先使用pip install ...


簡潔的web框架Bottle

簡介

Bottle是一個非常簡潔,輕量web框架,與django形成鮮明的對比,它只由一個單文件組成,文件總共只有3700多行代碼,依賴只有python標準庫。但是麻雀雖小五臟俱全,基本的功能都有實現,很適合做一些小的web應用

開始使用

首先使用pip install bottle安裝
然後是一個官方文檔中的例子:


from bottle import route, run  @route('/hello') def hello():     return "Hello World!"  run(host='localhost', port=8080, debug=True)

what? 只有5行代碼,只有一個文件,就能跑了?
這真是太簡潔了,我覺得非常適合我們寫一些小的web頁面應用,比起使用django要快速的多
還可以用下邊這種方式啟動:


from bottle import  Bottle
bt = Bottle()
@bt.route('/hello')
def hello():
    return "Hello World!"

bt.run(host='localhost', port=8080, debug=True)

Bottle的實例對象同樣擁有這些方法

url路由

靜態路由

通過上面的例子可以看到,Bottle框架的路由方式是通過裝飾器來實現的,像這樣@bt.route(‘/hello’),這種方式和和flask的路由方式一樣,同django就有大不同了
如果習慣了django的路由方式,再看到Bottle這種裝飾器路由的方式,一定會覺得這樣真是很快速,至少這是在同一個文件里
剛纔的例子當中的路由方式是靜態路由,下麵是動態路由的方式

動態路由

我們看一下幾種動態路由的方式


@route ('/ wiki / <pagename>' )    # pagename會成為參數  
       def show_wiki_page (pagename):     

@route('/object/<id:int>')         # 使用過濾器,id為名稱,int是匹配方式,並且會自動轉為int型
 def callback(id):     assert isinstance(id, int) 

 @route('/show/<name:re:[a-z]+>')    # 可以使用正則表達式
 def callback(name):     assert name.isalpha() 

 @route('/static/<path:path>')   # path的意義為以非貪婪的方式匹配包括斜杠字元在內的所有字元,並且可用於匹配多個路徑段。
 def callback(path):     return static_file(path, ...)

# 等等

HTTP請求方法路由

這意味只匹配允許的請求方式


from bottle import get, post

@get('/login')    # get方式的login

@post('/login')    # post方式的login

#get(),post(),put(),delete()或patch()

@route('/hello/', method='POST')  #通過參數決定,

內置模板

我們返回給客戶端的內容不僅僅是字元串,更多的是html文件,如何返回html文件呢?


from bottle import  Bottle,template
bt = Bottle()
@bt.route('/hello')
def hello():

    return template('hello.html')

bt.run(host='localhost', port=8080, debug=True)

引入template後就可以使用模板了,那麼hello.html是在哪裡呢?
查看源碼

TEMPLATE_PATH預設是/與/views下,當然也可以配置bottle.TEMPLATE_PATH來改變預設路徑
除此之外模板同樣允許在html中使用傳入的參數,比如這樣:


return template('hello.html',name='sfencs')

hello.html中:


hello{{name}}

不僅如此,模板還支持:

  • % x = “sfencs” 一行python代碼
  • <% %> 之間是代碼塊
  • % if True: if語句
    % end
  • % for i in name: for迴圈語句
    % end

使用函數

有一些內置函數可以直接在模板中使用

  • include(sub_template, **variables)
    可以導入其他的模板文件,例如:

% include('header.html', title='Page Title')
 Page Content
 % include('footer.html')

來導入header與footer,並且可以傳入參數

  • rebase(name, **variables)
    例如:index.html中寫:

% rebase('hello.html', title='Page Title')
<p>Page Content ...</p>

hello.html中寫:


<html>
<head>
  <title>{{title or 'No title'}}</title>
</head>
<body>
  {{!base}}
</body>
</html>

作用相當於把index.html變為變數名為base的變數在hello.html中使用,並且可以傳入參數,在服務的返回的頁面還是index.html


from bottle import  Bottle,template
bt = Bottle()
@bt.route('/hello')
def hello():

    return template('index.html')

bt.run(host='localhost', port=8080, debug=True)
  • defined(name)
    檢查變數是否被定義
  • get(name, default=None)
    獲取變數的值
  • setdefault(name, default)
    變數設置預設值
  • 自定義函數
    也就是把函數傳給模板使用

from bottle import  Bottle,template
bt = Bottle()
@bt.route('/hello')
def hello():

    return template('index.html',func=myfunc)

def myfunc():
    return 'my func'

bt.run(host='localhost', port=8080, debug=True)

index.html中:


{{func()}}

request與response

http請求必然有request與response對象
使用request對象需要引入request


from bottle import request

這時在請求中便可獲取request對象中的內容,例如:


from bottle import  Bottle,template
from bottle import request,response
bt = Bottle()
@bt.route('/hello')
def hello():
    print(request.headers)
    return template('index.html')

bt.run(host='localhost', port=8080, debug=True)

request對象中還有很多屬性

  • request.headers請求頭信息
  • request.query get請求信息
  • request.forms post請求信息
  • request.files 上傳文件信息
  • request.params get和post請求信息
  • request.GET get請求信息
  • request.POST post和上傳信息
  • request.cookies cookie信息
  • 等等
    response對象使用是類似的:

from bottle import  Bottle,template
from bottle import request,response
bt = Bottle()
@bt.route('/hello')
def hello():

    response.add_header('sss','aaa')
    return template('index.html')

bt.run(host='localhost', port=8080, debug=True)

這時在瀏覽器中能夠找到響應頭中多了sss

response的屬性有:

  • response.status_line 狀態行
  • response.status_code 狀態碼
  • response.headers 響應頭
  • response.charset 編碼
  • response.set_cookie 在瀏覽器上設置cookie
  • response.delete_cookie 在瀏覽器上刪除cookie
  • 等等

http錯誤與重定向

使用abort()來返回錯誤:


from bottle import route, abort @route('/restricted') def restricted():     abort(401, "Sorry, access denied.")

使用redirect()來重定向


from bottle import redirect @route('/wrong/url') def wrong():     redirect("/right/url")

伺服器的使用

在執行run方法時,bottle預設使用wsgiref,wsgiref是開發時預設使用的單線程伺服器,但通過指定參數可以改變伺服器:


run(host='localhost', port=8080,server='paste')

具體可以使用哪些伺服器可以參考http://www.bottlepy.org/docs/dev/deployment.html,
這裡放一個截圖

總結

在這裡只是對Bottle框架的使用做了一個簡單的介紹,具體學習還要參考官方文檔
對於簡單的web應用使用與web框架源碼的學習,我認為Bottle是一個不錯的選擇。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 把常見的日期格式如:YYYY-MM-DD 轉換成一種更易讀的格式。 易讀格式應該是用月份名稱代替月份數字,用序數詞代替數字來表示天 (1st 代替 1). 記住不要顯示那些可以被推測出來的信息: 如果一個日期區間里結束日期與開始日期相差小於一年,則結束日期就不用寫年份了;在這種情況下,如果月份開始和 ...
  • 一、基於度量對程式結構的分析 1. 第一次作業 1.1 基於類的分析的度量 首先,基於類的屬性個數,方法個數,每個方法的規模,每個方法的控制分支數目,類總代碼規模等特征對本次作業的結構進行分析。 1.2 基於類間內聚和耦合的度量 我使用了MetricsReloaded插件來對代碼的複雜度進行了分析。 ...
  • Sentry(直譯為:哨兵)是一個開源錯誤跟蹤服務,幫助開發人員實時監控和修複崩潰 Sentry本質上是一種幫助您實時監控和修複崩潰的服務 1. 安裝客戶端SDK 這裡我們安裝Java平臺的SDK,而且使用logback的方式集成 https://docs.sentry.io/clients/jav ...
  • 前言 開心一刻 那年去相親,地點在飯店裡,威特先上了兩杯水,男方紳士的喝了一口,咧嘴咋舌輕放桌面,手撫額頭閉眼一臉陶醉,白水硬是喝出了82年拉菲的感覺。如此有生活情調的幽默男人,果斷拿下,相處後卻發現他比較木訥,問他為什麼那天喝水那麼有趣,他仰頭道:鬼知道那杯水怎麼那麼燙啊! 是什麼 Factory ...
  • 摘要:本文使用了7中方法實現在多線程中讓線程按順序運行的方法,主要目的是讓讀者對多線程的使用有更深刻的瞭解。 ...
  • 讀了一本還不錯的書「編寫高質量代碼改善 Python 程式的 91 個建議」,大多數的建議是真心不錯,我雖然寫python也有3年多了,但是有些地方確實沒去註意過,特地整理了一下,給大家參考。 我已經打包好了一份電子書,有興趣的可以關註公眾號:**Python專欄**。後臺回覆:**91個建議**... ...
  • 原文鏈接:Learn C++ Multi-Threading in 5 Minutes C++14的新的多線程架構非常簡單易學,如果你對C或者C++很熟悉,那麼本文非常適合你。作者用C++14作為基準參考,但是所介紹的東西在C++17中也依然適用。本文只介紹基本的架構,在讀完本文後你應該也可以自己編 ...
  • 前提介紹: 本人是一名大三學生,主要使用C++開發,興趣是高性能的伺服器方面。 網路開發離不開網路庫,所以今天開始學一個新的網路庫,陳老師的muduo庫 我參考的書籍就是陳老師自己關於muduo而編著這本《linux多線程伺服器編程》 為什麼選擇muduo網路庫: 我當初選擇muduo網路庫有三個方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...