国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

初識Bottle(二)

stormjun / 3028人閱讀

摘要:而其他的引擎,例如能夠幫我們進行驗證登錄自此,官網的我們已經大致有了了解后續我們可以選擇運用該框架實現一些簡單的應用,或者可以深入研究其源碼,提升自身的編程水平

在初識Bottle(一)中,我們了解了Bottle的基本用法
在Bottle源碼閱讀(一)和Bottle源碼閱讀(二)可以查看個人對bottle源碼的相關閱讀筆記

下面繼續閱讀Bottle的官方文檔https://bottlepy.org/docs/dev...

1.路由靜態文件

在bottle中例如css等的文件是不會被自動加載的,因此需要自己定義callback函數,通過調用使用

from bottle import static_file
@route("/static/")
def server_static(filename):
    return static_file(filename, root="/path/to/your/static/files")
2.錯誤頁

通過error裝飾器可以對相應的錯誤碼自定義對應的應用函數

from bottle import error
@error(404)
def error404(error):
    return "Nothing here, sorry"
3.內容返回

Bottl框架允許應用函數返回如下類型的結果

Dictionaries字典:
python的字典通過框架被轉換為json字符串,而header中的Content-Type則會被設置為application/json

Empty Strings, False, None or other non-true values:
header中的Content-Length被設置為0

Unicode strings
Byte strings
Instances of HTTPError or HTTPResponse
File objects
Iterables and generators

4.改變默認編碼

通過在應用函數中改變response的屬性可以自定義

from bottle import response
@route("/iso")
def get_iso():
    response.charset = "ISO-8859-15"
    return u"This will be sent with ISO-8859-15 encoding."

@route("/latin9")
def get_latin():
    response.content_type = "text/html; charset=latin9"
    return u"ISO-8859-15 is also known as latin9."
5.靜態文件的使用

通過static_file接口,我們可以實現調用和下載

from bottle import static_file
@route("/images/")
def send_image(filename):
    return static_file(filename, root="/path/to/image/files", mimetype="image/png")

@route("/static/")
def send_static(filename):
    return static_file(filename, root="/path/to/static/files")
    
@route("/download/")
def download(filename):
    return static_file(filename, root="/path/to/static/files", download=filename)
6.HTTP ERRORS AND REDIRECTS

通過abort可以快速定義錯誤碼相應的錯誤頁內容
redirect實現重定向

from bottle import route, abort
@route("/restricted")
def restricted():
    abort(401, "Sorry, access denied.")
    
from bottle import redirect
@route("/wrong/url")
def wrong():
    redirect("/right/url")
7.RESPONSE

response對象包括了響應的metadata例如狀態碼,headers,cookie等

response的狀態碼控制瀏覽器的行為,默認200ok
response的header可以通過set_header()來設置,對同一個header項,還可以通過add_header添加額外內容
cookie是保留在用戶瀏覽器的一些數據,可以通過get_cookie和set_cookie來操作

@route("/hello")
def hello_again():
    if request.get_cookie("visited"):
        return "Welcome back! Nice to see you again"
    else:
        response.set_cookie("visited", "yes")
        return "Hello there! Nice to meet you"

cookie是容易被偽造的,所以Bottle框架提供了cookie的簽名機制,只需要提供一個secret的參數作為密鑰
Bottle會自動持久化和去持久化保存在cookie中的數據,cookie不超過4k。
此時cookie仍然能從瀏覽器中查看到,而且是可以被復制的,所以最好不要將密鑰的信息放在用戶客戶端

@route("/login")
def do_login():
    username = request.forms.get("username")
    password = request.forms.get("password")
    if check_login(username, password):
        response.set_cookie("account", username, secret="some-secret-key")
        return template("

Welcome {{name}}! You are now logged in.

", name=username) else: return "

Login failed.

" @route("/restricted") def restricted_area(): username = request.get_cookie("account", secret="some-secret-key") if username: return template("Hello {{name}}. Welcome back.", name=username) else: return "You are not logged in. Access denied."
8.REQUEST

request 對象包括了Cookies, HTTP header, HTML

等一系列可以操作的對象

from bottle import request, route, template

@route("/hello")
def hello():
    name = request.cookies.username or "Guest"
    return template("Hello {{name}}", name=name)

Bottle使用FormsDict存儲表單數據和cookie數據,而FormsDict的特定就是既具備了普通字典的操作方法,又能將key作為對象的屬性,具體如下name既是字典的key又是cookies的屬性

name = request.cookies.name

# is a shortcut for:

name = request.cookies.getunicode("name") # encoding="utf-8" (default)

# which basically does this:

try:
    name = request.cookies.get("name", "").decode("utf-8")
except UnicodeError:
    name = u""

同時,FormsDict還能對單個key存儲多個值

for choice in request.forms.getall("multiple_choice"):
    do_something(choice)

request的query string會被分解為多個鍵值對,而通過request.query可以直接獲得查詢字符串對應鍵的值

from bottle import route, request, response, template
@route("/forum")
def display_forum():
    forum_id = request.query.id
    page = request.query.page or "1"
    return template("Forum ID: {{id}} (page {{page}})", id=forum_id, page=page)

上傳文件時,我們需要在表單添加enctype="multipart/form-data", 同時將type設置為file


  Category:      
  Select a file: 
  

文件上傳到服務端后

@route("/upload", method="POST")
def do_upload():
    category   = request.forms.get("category")
    upload     = request.files.get("upload")
    name, ext = os.path.splitext(upload.filename)
    if ext not in (".png",".jpg",".jpeg"):
        return "File extension not allowed."

    save_path = get_save_path_for_category(category)
    upload.save(save_path) # appends upload.filename automatically
    return "OK"

通過BaseRequest.body我們可以直接獲取原始的請求體,也可以獲取environ

@route("/my_ip")
def show_ip():
    ip = request.environ.get("REMOTE_ADDR")
    # or ip = request.get("REMOTE_ADDR")
    # or ip = request["REMOTE_ADDR"]
    return template("Your IP is: {{ip}}", ip=ip)
9.模板

Bottle內建了前端模板引擎,在官網給出的這個例子中,會加載./views/中的hello_template.tpl

@route("/hello")
@route("/hello/")
def hello(name="World"):
    return template("hello_template", name=name)
或者
@route("/hello")
@route("/hello/")
@view("hello_template")
def hello(name="World"):
    return dict(name=name)
%if name == "World":
    

Hello {{name}}!

This is a test.

%else:

Hello {{name.title()}}!

How are you?

%end

模板在編譯后會被緩存到內存中,修改后需要執行bottle.TEMPLATES.clear()清除緩存模板

10.PLUGINS

Bottle提供了一系列的第三方引擎,這些能夠有效地減少重復性工作
官網使用SQLitePlugin作為例子,在每一次調用需要與數據庫進行交互的callback函數時,該引擎會自動創建連接和關閉連接。而其他的引擎,例如’auth‘能夠幫我們進行驗證登錄

from bottle import route, install, template
from bottle_sqlite import SQLitePlugin

install(SQLitePlugin(dbfile="/tmp/test.db"))

@route("/show/")
def show(db, post_id):
    c = db.execute("SELECT title, content FROM posts WHERE id = ?", (post_id,))
    row = c.fetchone()
    return template("show_post", title=row["title"], text=row["content"])

@route("/contact")
def contact_page():
    """ This callback does not need a db connection. Because the "db"
        keyword argument is missing, the sqlite plugin ignores this callback
        completely. """
    return template("contact")
sqlite_plugin = SQLitePlugin(dbfile="/tmp/test.db")
install(sqlite_plugin)

uninstall(sqlite_plugin) # uninstall a specific plugin
uninstall(SQLitePlugin)  # uninstall all plugins of that type
uninstall("sqlite")      # uninstall all plugins with that name
uninstall(True)          # uninstall all plugins at once

自此,Bottle官網的tutorial我們已經大致有了了解
后續我們可以選擇運用該框架實現一些簡單的應用,或者可以深入研究其源碼,提升自身的編程水平

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/38445.html

相關文章

  • 初識 Bottle (一)

    摘要:安裝是一個輕量型的不依賴于任何第三方庫的框架,整個框架只有一個文件。向打聲招呼吧新建一個文件在瀏覽器或者,,得到結果當使用裝飾器綁定路由時,實際是使用了的默認應用,即是的一個實例。 1. 安裝 bottle是一個輕量型的不依賴于任何第三方庫的web框架,整個框架只有bottle.py一個文件。 wget http://bottlepy.org/bottle.py 2. 向bottl...

    mengbo 評論0 收藏0
  • Bottle源碼閱讀(一)

    摘要:在初識一中,我們了解了框架的基本用法。在本篇文章中,我們通過源碼來探究一些基本原理。因此下一步就是研究我們寫的應用函數是如何被封裝成適配的 在初識bottle(一)中,我們了解了bottle框架的基本用法。在本篇文章中,我們通過源碼來探究一些基本原理。 1. run的實現 所有的框架請求響應都基于一個原理http請求 --> wsgi服務器 --> wsgi接口(實際就是框架中自定義...

    whidy 評論0 收藏0
  • Bottle源碼閱讀(

    摘要:在源碼閱讀一中,我們了解了如何接收請求,處理請求以及如何檢測模塊變化重啟。接下來我們看一下源碼是怎么實現的經過封裝后,最終獲得的是具備有一些屬性的裝飾器當為時,將的屬性傳遞給,使其具備相同的屬性。 在《Bottle源碼閱讀(一)》中,我們了解了bottle如何接收請求,處理請求以及如何檢測模塊變化重啟server。在ServerHandler類中的run函數中,application接...

    zzbo 評論0 收藏0
  • Bottle框架中的裝飾器類和描述符應用

    摘要:最近在閱讀微型框架的源碼,發現了中有一個既是裝飾器類又是描述符的有趣實現。所以第三版的代碼可以這樣寫第三版的代碼沒有使用裝飾器,而是使用了描述符這個技巧。更大的問題來自如何將描述符與裝飾器結合起來,因為是一個類而不是方法。 最近在閱讀Python微型Web框架Bottle的源碼,發現了Bottle中有一個既是裝飾器類又是描述符的有趣實現。剛好這兩個點是Python比較的難理解,又混合在...

    Panda 評論0 收藏0
  • 使用python抓取百度漂流瓶妹紙照片

    摘要:無意中發現貼吧也出了個漂流瓶的東西,隨手翻了翻發現居然有好多妹子圖,閑來無事于是就想寫個爬蟲程序把圖片全部抓取下來。具體獲取一頁內容的如下看參數很容易明白,就是當前頁碼,就是當前頁中包含的漂流瓶數量。 showImg(https://segmentfault.com/img/bVLUTV?w=638&h=808); 無意中發現貼吧也出了個漂流瓶的東西,隨手翻了翻發現居然有好多妹子圖,閑...

    bang590 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<