tornado學習筆記day03-響應輸出

write:

作用:

將chunk中的數據寫到輸出緩沖區

利用write方法寫json數據

  • 我們自己手動序列化json的那種方式Content-Type 的屬性值為text-html
  • 而我們采用write自動序列化方式,我們的content-type 屬性為application/json

set_default_headers():

作用:

  • 在進入HTTP響應方法之前被調用
  • 可以重新寫該方法來設置默認的headers

注意:

  • 在這個HTTP處理方法中使用set_header設置的字段會覆蓋set_default_headers()的值
  • 這個set_header和set_default_headers()是有執行的先后順序的,默認那個當然那先就執行了

set_status(status_code,reason=none):

作用:為響應設置狀態碼

參數:

status_code:

  • 狀態碼的值,為int類型
  • 如果reason的值為none,則狀態碼必須為正常值

reason

  • String類型
  • 描述狀態碼的詞組,比如404 not found 中的not found

重定向 self.redirect(url):

作用:

  • 比如你有時候寫index,有時候不寫,都能進到首頁里面,這就是重定向的作用
  • 重定向到url網址

示例:

class RedirectHandler(RequestHandler):def get(self):# 直接就重定向了self.redirect("/")

self.send_error(status_code = 500,**kwargs):

  • 作用:
    • 拋出HTTP錯誤狀態碼,默認為500
    • tornado會調用write_error()方法進行處理
    • 對應Django里面自定義404一樣

write_error(status_code,**kwargs):

  • 作用:
    • 用來處理send_error拋出的錯誤信息,并返回給瀏覽器錯誤界面
  • 示例:
class ErrorHandler(RequestHandler):def write_error(self, status_code: int, **kwargs: Any) -> None:if status_code == 500:self.write("服務器內部錯誤500了")elif status_code == 404:self.write("資源不存在")else:self.write("我也不知道是啥錯誤")def get(self):# 直接就重定向了flag = self.get_query_argument("flag")if flag == '0':print("有錯誤")self.send_error(500)# 這里拋出錯誤,下面就不會執行了print("沒毛病")self.write("you are right!")

路由的反向解析

這個tornado里面的比Django的反向解析還要簡單一點

給路由起個名字,便于url改變后,跳轉鏈接失效

應用端

class Application(tornado.web.Application):def __init__(self):handlers = [(r"/", index.IndexHandler),(r"/sunck", index.SunckHandler,{'name':"victor",'age':19}),# 狀態碼(r"/status", index.StatusHandler),# 重定向(r"/index", index.RedirectHandler),# 錯誤處理# iserror?flag=2# 如果等于0就說明,有錯誤,不等于0就說明沒有錯誤(r"/iserror", index.ErrorHandler),tornado.web.url(r"/kaige",index.KaigeHandler,name='kaige'),]super(Application,self).__init__(handlers)

視圖函數

class IndexHandler(RequestHandler):def get(self):self.write("main page info tornado!")self.write("<br>")url = self.reverse_url("kaige")self.write("<a href='%s'>去另一個頁面</a>" % (url))# self.write("<a href="+url+">去另一個頁面</a>")

tornado.Web.RequestHandler

利用HTTP協議向服務器傳遞參數

提取uri的特定部分

http://127.0.0.1:8080/good/nice/handsome/cool

實例代碼,app部分

''' (r"/good/(\w+)/(\w+)/(\w+)", index.GoodHandler),'''
(r"/good/(?P<p1>\w+)/(?P<p3>\w+)/(?P<p2>\w+)", index.GoodHandler),

視圖函數部分

class GoodHandler(RequestHandler):def get(self,p1,p3,p2):self.write("GoodHandler kaige !")self.write("<br>")self.write(p3)self.write("<br>")self.write(p2)self.write("<br>")self.write(p1)                  

查詢字符串(GET方式傳遞參數)

http://127.0.0.1:8080/zhangmanyu?a=1&b=2&c=4類型

這里有一個方法
def get_query_argument(self,name: str,default: Union[None, str, _ArgDefaultMarker] = _ARG_DEFAULT,strip: bool = True,) -> Optional[str]:
參數
name:
  • 從get請求參數中返回指定參數的值
  • 如果出現同名參數,理論上這個方法會返回最后一個值
default
  • 如果我們設置了為未傳遞name參數,它會返回默認的值
strip
  • 表示是否過濾掉兩邊的空白字符
  • 默認為True,過濾

http://127.0.0.1:8080/zhangmanyu?a=1&a=2&c=4類型

  • 一般情況下,很少出現這種情況的
  • def get_query_arguments(self, name: str, strip: bool = True) -> List[str]:
  • 參數: 同上

請求體攜帶數據(POST方式傳遞參數)

  • 這個厲害了,比Django方便,不用在定義一路由函數了,直接在類里面加一個方法就就行了
  • 原型在這里
def get_body_argument(self,name: str,default: Union[None, str, _ArgDefaultMarker] = _ARG_DEFAULT,strip: bool = True,) -> Optional[str]:

既可以獲取GET請求,也可以獲取POST請求

  • 直接就上原型就OK了,你不僅要學會舉一反三,還要自己進行拓展
  • 原型在這里
def get_argument(  # noqa: F811self,name: str,default: Union[None, str, _ArgDefaultMarker] = _ARG_DEFAULT,strip: bool = True,
) -> Optional[str]:
  • 其實有時候,有的結構,看源碼才能理解的更加的深刻
  • 還有一個多個的,也是這么回事兒
def get_arguments(self, name: str, strip: bool = True) -> List[str]:

在HTTP報文頭中,增加自定義的字段

request對象

作用

  • 存儲了關于請求的相關信息

比如:

  • HTTPServerRequest(protocol='http', host='127.0.0.1:8080', method='GET', uri='/zhuyin', version='HTTP/1.1', remote_ip='127.0.0.1')

屬性

  • method: HTTP請求的方式
  • host: 被請求的主機名(服務器的主機名)
  • uri: 請求的完整資源地址,包括路徑和get查詢的參數部分
  • path: 請求的路徑部分
  • query: 請求參數部分
  • version: 使用的HTTP版本
  • headers: 請求的協議頭,字典類型
  • body: 請求體數據(POST)
  • remote_ip: 客戶端的ip地址
  • files: 用戶上傳的文件,字典類型

tornado.httputil.HTTPFile對象

  • 功能:在我們上傳文件中才能看到他
  • 作用:
    是收到的文件對象

屬性:

  • filename: 文件的實際名字
  • body: 文件的數據實體
  • content-type: 上傳文件的類型

文件上傳

首先,先要濾清一個數據結構,就是request.file對象的數據結構

'''
一個request.file對象的結構示例
{'file': [{'filename': 'a.txt','body': b'suck is a wonderful man','content_type': 'text/plain'},{'filename': 'reg.md','body': b'x9xa0','content_type': 'application/octet-stream'}]'img': [{'filename': 'a.img','body': b'as\dfhg\ahhf\a\\h\ahfh\af','content_type': 'text/plain'}]
}
'''

然后,用循環來進行遍歷!

class UpFileHandler(RequestHandler):def get(self):self.render("upfile.html")def post(self):self.write("上傳成功!")contents = self.request.filesfor content in contents:fileArr = contents[content]for fileObj in fileArr:file_path = os.path.join(BASE_DIR,"upfile/"+fileObj.filename)with open(file_path,"wb") as f:f.write(fileObj.body)print("文件寫入成功")

我知道,要是看不懂那就加一點批注唄!

''' 導入系統操作模塊,用于存儲接受的文件'''
import os
# 導入BASE_DIR,定位到服務器中的絕對路徑
from config import BASE_DIR
from tornado.web import RequestHandlerclass IndexHandler(RequestHandler):def get(self):self.write("main page info tornado!")class UpFileHandler(RequestHandler):'''用于上傳文件的視圖類,其中包含顯示表單的get方法和用于處理上傳的POST方法'''# get方法,加載表單模板def get(self):self.render("upfile.html")# 文件上傳指定是POST請求啦def post(self):# 用于接收上傳的信息self.write("上傳成功!")# 通過request.files對象來獲取所有文件對象內容contents = self.request.files# 遍歷最大的字典,拿到沒個name類型的字典的鍵# 其中content是字典中的鍵,比如file,imgfor content in contents:# 通過鍵獲取值,拿到相同name的文件列表# 這個filearr,就是一個listfileArr = contents[content]# 遍歷文件列表# 這個fileObj又是一個dict字典類型for fileObj in fileArr:# 定義存儲路徑# 通過BASE_DIR來獲取服務器的絕對位置# 其中通過這個fileObj的字典的filename鍵,# 來獲取文件名字,來定義存儲路徑的文件名稱file_path = os.path.join(BASE_DIR,"upfile/"+fileObj.filename)# 寫入文件with open(file_path,"wb") as f:# 文件的內容就是bodyf.write(fileObj.body)# TODO 這里還需要處理的就是,用戶上傳同名文件#  導致文件重新在服務器中覆蓋的問題print("文件寫入成功")

相似文章

tornado學習筆記day01
tornado學習筆記day02
tornado學習筆記day03
tornado學習筆記day04
tornado學習筆記day05
tornado學習筆記day06
tornado學習筆記day07
tornado學習筆記day08

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455244.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455244.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455244.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Machine Learning——octave矩陣操作(2)——DAY3

矩陣的數學操作&#xff1a; Assumed: a為一個矩陣&#xff0c;m是一個向量 Log(a)——求每一個元素的對數 Exp(a)——以e為底的指數 1./a——求每個元素的導師 [a,b]max(m)——m是一個向量&#xff0c;a為m當中最大的元素&#xff0c;b為a在m中的排列序號&#xff08;已按從小…

python 多進程并發_python并發編程之多進程

一 multiprocessing模塊介紹python中的多線程無法利用多核優勢&#xff0c;如果想要充分地使用多核CPU的資源(os.cpu_count()查看)&#xff0c;在python中大部分情況需要使用多進程。Python提供了multiprocessing。multiprocessing模塊用來開啟子進程&#xff0c;并在子進程中執…

tornado學習筆記day04-執行順序

響應輸出 -> write 原型 self.write()函數 源碼中是這樣定義的 def write(self, chunk: Union[str, bytes, dict]) -> None:作用 將chunk數據寫到緩沖區 刷新緩沖區的四種方式 程序中斷手動刷新緩沖區滿了遇到\n 當你寫了一個print之后,不是直接就顯示在黑屏中斷…

字符串中文判斷

2019獨角獸企業重金招聘Python工程師標準>>> 1、判斷字符串是否全是中文或含有中文 <?php header(Content-type:text/html; charsetutf-8); $str 你好; if(preg_match(/^[\x{4e00}-\x{9fa5}]$/u, $str)>0){ echo 全是中文; …

angular使用動態組件后屬性值_Angular動態加載組件

引言有時候需要根據URL來渲染不同組件&#xff0c;我所指的是在同一個URL地址中根據參數的變化顯示不同的組件&#xff1b;這是利用Angular動態加載組件完成的&#xff0c;同時也會設法讓這部分動態組件也支持AOT。動態加載組件下面以一個Step組件為示例&#xff0c;完成一個3個…

分治2--取余運算

分治2--取余運算 一、心得 二、題目和分析 題目描述 輸入b&#xff0c;p&#xff0c;k的值&#xff0c;求bp mod k的值。其中b&#xff0c;p&#xff0c;k*k為長整型數。輸入 三個整數&#xff0c;分別為b&#xff0c;p&#xff0c;k的值輸出 bp mod k樣例輸入 2 10 9樣例輸出 …

-mysql-鎖機制分為表級鎖和行級鎖

2019獨角獸企業重金招聘Python工程師標準>>> 聲明&#xff1a;本欄目所使用的素材都是凱哥學堂VIP學員所寫&#xff0c;學員有權匿名&#xff0c;對文章有最終解釋權&#xff1b;凱哥學堂旨在促進VIP學員互相學習的基礎上公開筆記。 mysql鎖機制分為表級鎖和行級鎖 …

tornado學習筆記day05-訪問數據庫

模板## 配置模板路徑 這個在之前我們已經配置好了,可以參考前面的文章 settings {# 就像upfile就沒有,你寫了也白扯template_path: os.path.join(BASE_DIR, "templates"), }渲染并返回給客戶端 使用render()方法 class HomeIndexHandler(RequestHandler):def ge…

pythonelectron桌面開發案例_使用Electron開發基于Node.js的桌面應用

最近小編在查看分享資料時&#xff0c;發現一個可以開發跨平臺桌面應用的框架——NW.js(原名&#xff1a;node-webkit)。正當小編興致勃勃的研究NW.js的時候&#xff0c;最基礎的安裝環節出了問題。無論用npm還是cnpm都無法完整下載所依賴的包(具體原因待考察)。鑒于此&#xf…

x264_param_t結構體參數分析

參考網上的一些資料&#xff0c;結合個人的理解&#xff0c;對x264中x264_param_t結構體作了初步的分析&#xff0c;不保證正確。對x264熟悉的朋友可以在這基礎上修改添加typedef struct x264_param_t{/* CPU 標志位 */unsigned int cpu;int i_threads; /* 并行編…

知識點總結

1、把一個類轉換成一個xml&#xff0c;首先&#xff0c;類名前需要加特性&#xff0c;[DataContract(Namespace "http://CYSoft.Services/AuthorizationObject")]&#xff0c;[XmlRoot("Org")]&#xff0c;里邊的名字為根節點的名字&#xff0c;對各個屬性…

tornado學習筆記day06-應用安全

應用安全 cookie 普通cookie 一般我們的用戶表中都有啥呢 你在購物的時候,加入購物車,讓你登錄,那你登錄之后,他怎么知道你登錄了呢 token 這個值是隨機的,存在cookie里面 設置 原型: 設置cookie 的方法 def set_cookie(self,name: str,value: Union[str, bytes],domai…

托福試卷真題_干貨解答考生疑惑,自考真題考過了還會在出嗎?

重視真題&#xff01;重視真題&#xff01;重視真題&#xff01;重要的話要說三遍。想自考的你們一定要注意&#xff0c;對于歷年真題&#xff0c;從來都是“備考必做”的態度。做自考真題&#xff0c;除了可以讓自己盡快熟悉考試題型和考點外&#xff0c;還有什么好處呢&#…

x264 struct學習 1

x264_t 結構體維護著CODEC的諸多重要信息 其中成員frames是一個指示和控制幀編碼過程的結構。其中current是已經準備就緒可以編碼的幀&#xff0c;其類型已經確定&#xff1b;next是尚未確定類型的幀&#xff1b;unused用于回收不使用的frame結構體以備今后再次使用。 struct …

2016 ACM/ICPC Asia Regional Dalian Online

自己還是太菜&#xff0c;補題離不開題解。。。 但還是留個博客&#xff0c;萬一以后忘了。。。 1001 Different Circle Permutation Polya定理&#xff0c;第一次遇見&#xff0c;學習了一下。不旋轉的時候可以得到 f[i]f[i-1]f[i-2] 斐波那契數列&#xff0c;旋轉后就可以通過…

tornado學習筆記day07-同步與異步

同步 概念 同步就是按部就班的依次執行我們的代碼 進階 但是有些情況我們有一些比較耗時的從操作,比如去別的地方拿點資源,去其他網站請求數據,去訪問數據庫,上傳文件等等,所以這里面優點瑕疵,有小編一一道來 比如這樣 本模塊的功能:<同步異步demo># 這個就相等于一個…

關鍵字: on

關鍵字: on 數據庫在通過連接兩張或多張表來返回記錄時&#xff0c;都會生成一張中間的臨時表&#xff0c;然后再將這張臨時表返回給用戶。 在使用left jion時&#xff0c;on和where條件的區別如下&#xff1a; 1、 on條件是在生成臨時表時使用的條件&#xff0c;它不管on中的條…

天融信安全接入客戶端_天融信提示您警惕物聯網設備Ripple20漏洞風險

近日&#xff0c;天融信阿爾法實驗室在JSOF實驗室發布的由Treck公司開發的TCP/IP軟件庫中獲取到一系列0day漏洞。JSOF實驗室發布的這批漏洞共計19個&#xff0c;被JSOF研究人員稱為"Ripple20"。受此軟件庫影響的產品數量估計超過數億&#xff0c;其中包括智能家居設備…

Service-Oriented Architecture,SOA(轉)

http://blog.csdn.net/WOOSHN/article/details/8036910 介紹&#xff1a; IT體系結構已非常成熟&#xff0c;它是一種成功處理典型IT問題的方法。體系結構中一個受到很大重視且相對較新的分支是面向服務的體系結構(SOA)。SOA經常被吹捧為企業用于解決應用程序靈活性和高維護成本…

tornado學習筆記day08-tornado中的異步

概述 應為epoll主要用來解決網絡的并發問題,所以tornado中的異步也是主要體現在網絡的IO異步上,即異步web請求 tornado.httpclient.AsyncHTTPClient tornado提供異步web請求客戶端,可以用來進行異步web請求, 這個客戶端和服務端是相對來說的,當tornado的Handler去其他位置去…