整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Python四大主流網絡編程框架,你知道么?

          并發處理框架—— Tornado

          Tornado 是使用 Python 編寫的一個強大的可擴展的 Web 服務器。它在處理高網絡流量時表現得足夠強健,卻在創建和編寫時有著足夠的輕量級,并能夠被用在大量的應用和工具中。Tornado 作為 FriendFeed 網站的基礎框架,于2009年9月10日發布,目前已經獲得了很多社區的支持,并且在一系列不同的場合中得到應用。除 FriendFeed 和 Facebook 外,還有很多公司在生產上轉向Tornado,包括 Quora、Turntable.fm、Bit.ly、Hipmunk 及 MyYearbook 等。

          相對于其他 Python 網絡框架,Tornado 有如下特點。

          完備的 Web 框架:與 Django、Flask 等一樣,Tornado 也提供了 URL 路由映射、Request 上下文、基于模板的頁面渲染技術等開發 Web 應用的必備工具。

          是一個高效的網絡庫,性能與 Twisted、Gevent 等底層 Python 框架相媲美:提供了異步 I/O 支持、超時事件處理。這使得 Tornado 除了可以作為 Web 應用服務器框架,還可以用來做爬蟲應用、物聯網關、游戲服務器等后臺應用。

          提供高效 HTTPClient:除了服務器端框架,Tornado 還提供了基于異步框架的HTTP 客戶端。

          提供高效的內部 HTTP 服務器:雖然其他 Python 網絡框架(Django、Flask)也提供了內部 HTTP 服務器,但它們的 HTTP 服務器由于性能原因只能用于測試環境。而 Tornado 的HTTP服務器與 Tornado 異步調用緊密結合,可以直接用于生產環境。

          完備的 WebSocket 支持:WebSocket 是 HTML5 的一種新標準,實現了瀏覽器與服務器之間的雙向實時通信。

          因為 Tornado 的上述特點,Tornado 常被用作大型站點的接口服務框架,而不像 Django 那樣著眼于建立完整的大型網站,所以本章著重講解 Tornado 的異步及協程編程、身份認證框架、獨特的非 WSGI 部署方式。

          支持快速建站的框架——Flask

          Flask 是 Python Web 框架族里比較年輕的一個,于 2010 年出現,這使得它吸收了其他框架的優點,并且把自己的主要領域定義在了微小項目上。同時,它是可擴展的,Flask 讓開發者自己選擇用什么數據庫插件存儲他們的數據。很多功能簡單但性能卓越的網站就是基于 Flask 框架而搭建的,比如 http://httpbin.org/ 就是一個功能簡單但性能強大的 HTTP 測試項目。Flask 是一個面向簡單需求和小型應用的微框架。

          相對于其他 Python 語言的 Web 框架而言,Flask 的特點可以歸結如下。

          內置開發服務器和調試器

          網絡程序調試是在將編制好的網站投入實際運行前,用手工或編譯程序等方法進行測試,修正語法錯誤和邏輯錯誤的過程。有經驗的開發者都知道,這是保證網站系統能夠正式應用的必要步驟。

          Flask 自帶的開發服務器使開發者在調試程序時無須再安裝其他任何網絡服務器,比如 Tomcat、JBoss、Apache 等。Flask 默認處于調試狀態,使得運行中的任何錯誤會同時向兩個目標發送信息:一個是 Python Console,即啟動Python 程序的控制臺;另一個是 HTTP 客戶端,即 Flask 開發服務器將調試信息傳遞給了客戶端。

          與 Python 單元測試功能無縫銜接

          單元測試是對最小軟件開發單元的測試,其重點測試程序的內部結構,主要采用白盒測試方法,由開發人員負責。單元測試的主要目標是保證函數在給定的輸入狀態下,能夠得到預想的輸出,在不符合要求時能夠提醒開發人員進行檢查。

          Flask 提供了一個與 Python 自帶的單元測試框架 unitest 無縫銜接的測試接口,即 Flask 對象的 test_client 函數。通過 test_client 函數,測試程序可以模擬進行 HTTP 訪問的客戶端來調用 Flask 路由處理函數,并且獲取函數的輸出來進行自定義的驗證。

          使用 Jinja2 模板

          將 HTML 頁面與后臺應用程序聯系起來一直是網站程序框架的一個重要目標。Flask 通過使用 Jinja2 模板技術解決了這個問題。Jinja2 是一個非常靈活的 HTML 模板技術,它是從 Django 模板發展而來的,但是比 Django 模板使用起來更加自由且更加高效。Jinja2 模板使用配制的語義系統,提供靈活的模板繼承技術,自動抗擊 XSS 跨站攻擊并且易于調試。

          完全兼容 WSGI 1.0 標準

          WSGI(Web Server Gateway Interface)具有很強的伸縮性且能運行于多線程或多進程環境下,因為 Python 線程全局鎖的存在,使得 WSGI 的這個特性至關重要。WSGI 已經是 Python 界的一個主要標準,各種大型網路服務器對其都有良好的支持。WSGI 位于Web應用程序與 Web 服務器之間,與 WSGI 完全兼容使得 Flask 能夠配置到各種大型網絡服務器中。

          基于 Unicode 編碼

          Flask 是完全基于 Unicode 的。這對制作非純 ASCII 字符集的網站來說非常方便。HTTP 本身是基于字節的,也就是說任何編碼格式都可以在 HTTP 中傳輸。但是,HTTP 要求在 HTTP Head 中顯式地聲明在本次傳輸中所應用的編碼格式。在默認情況下,Flask 會自動添加一個 UTF-8 編碼格式的 HTTP Head,使程序員無須擔心編碼的問題。

          底層自定義協議網絡框架——Twisted

          以上講到的 2個 Python Web 框架都是圍繞著應用層 HTTP 展開的,而 Twisted是一個例外。Twisted 是一個用 Python 語言編寫的事件驅動的網絡框架,對于追求服務器程序性能的應用,Twisted 框架是一個很好的選擇。

          Twisted 是一個有著 10 多年歷史的開源事件驅動框架。Twisted 支持很多種協議,包括傳輸層的 UDP、TCP、TLS,以及應用層的 HTTP、FTP 等。對于所有這些協議,Twisted 提供了客戶端和服務器方面的開發工具。

          Twisted 框架的歷史悠久,其主要發行版本都以 Python 2 為基礎,最新的版本為基于 Python 2.7 的 Twisted-15.4.0。Twisted 社區正在開發基于 Python 3 的版本,但目前為止尚沒有基于 Python 3 的 Twisted 穩定發行版。

          Twisted 是一個高性能的編程框架。在不同的操作系統平臺上,Twisted 利用不同的底層技術實現了高效能通信。在 Windows 中,Twisted 的實現基于 I/O 完成端口(IOCP,Input/Output Completion Port)技術,它保證了底層高效地將I/O事件通知給框架及應用程序;在 Linux 中,Twisted 的實現基于 epoll 技術,epoll是Linux下多路復用 I/O 接口 select/poll 的增強版本,它能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統 CPU 利用率。

          在開發方法上,Twisted引導程序員使用異步編程模型。Twisted 提供了豐富的Defer、Threading等特性來支持異步編程。

          企業級開發框架——Django

          Django 于 2003 年誕生于美國堪薩斯(Kansas)州,最初用來制作在線新聞Web站點,于 2005 年加入了 BSD 許可證家族,成為開源網絡框架。Django 根據比利時的爵士音樂家 Django Reinhardt 命名,作者這樣命名 Django 意味著Django 能優雅地演奏(開發)功能豐富的樂曲(Web應用)。

          它是當前Python世界里最負盛名且最成熟的網絡框架。最初用來制作在線新聞的 Web 站點,目前已發展為應用最廣泛的 Python 網絡框架。Django 的各模塊之間結合得比較緊密,所以在功能強大的同時又是一個相對封閉的系統,但是其健全的在線文檔及開發社區,使開發者在遇到問題時能找到解決方法。

          Django 框架的特點

          相對于 Python 的其他 Web 框架,Django 的功能是最完整的,Django 定義了服務發布、路由映射、模板編程、數據處理的一整套功能。這也意味著 Django模塊之間緊密耦合,開發者需要學習 Django 自己定義的這一整套技術。Django的主要特點如下。

          完善的文檔:經過 10 多年的發展和完善,Django 有廣泛的應用和完善的在線文檔,開發者遇到問題時可以搜索在線文檔尋求解決方案。

          集成數據訪問組件:Django 的 Model 層自帶數據庫 ORM 組件,使開發者無須學習其他數據庫訪問技術(dbi、SQLAlchemy 等)。

          強大的 URL 映射技術:Django 使用正則表達式管理 URL 映射,因此給開發者帶來了極高的靈活性。

          后臺管理系統自動生成:開發者只需通過簡單的幾行配置和代碼就可以實現完整的后臺數據管理 Web 控制臺。

          錯誤信息非常完整:在開發調試過程中如果出現運行異常,則 Django 可以提供非常完整的錯誤信息幫助開發者定位問題,比如缺少xxx組件的配置引用等,這樣可以使開發者馬上改正錯誤。

          Django 的組成結構

          Django 是遵循MVC架構的Web開發框架,其主要由以下幾部分組成。

          管理工具(Management):一套內置的創建站點、遷移數據、維護靜態文件的命令工具。

          模型(Model):提供數據訪問接口和模塊,包括數據字段、元數據、數據關系等的定義及操作。

          視圖(View):Django 的視圖層封裝了 HTTP Request 和 Response 的一系列操作和數據流,其主要功能包括URL映射機制、綁定模板等。

          模板(Template):是一套 Django 自己的頁面渲染模板語言,用若干內置的tags和filters定義頁面的生成方式。

          表單(Form):通過內置的數據類型和控件生成 HTML 表單。

          管理站(Admin):通過聲明需要管理的 Model,快速生成后臺數據管理網站。

          *聲明:本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。

          ython 的 Tornado 框架,屬于 Python 的一個 Web 框架,是由 Python 編寫的 Web 服務器兼 Web 應用框架。


          Step1:Tornado 是什么

          Tornado 是一個基于 Python 的 Web 服務框架和異步網絡庫。

          最早開發于 FriendFeed 公司,通過利用非阻塞網絡 I/O, Tornado 可以承載成千上萬的活動連接, 完美的實現了長連接, WebSockets, 和其他對于每一位用戶來說需要長連接的程序。


          Step2:Tornado 有什么優勢

          Tornado 具有什么樣的優點,我們為什么要用它?

          ? 輕量級 Web 框架

          ? 異步非阻塞 IO 處理方式

          ? 出色的抗負載能力

          ? 優異的處理性能,不依賴多進程/多線程,一定程度上解決 C10K 問題

          ? WSGI全棧替代產品,推薦同時使用其 Web 框架和 HTTP 服務器


          Step3:Tornado 如何安裝

          pip install tornado 【安裝最新穩定版】
          
          pip install tornado==version 【指定版本安裝】


          Step4:Tornado 核心內容

          4.1 Tornado.Web:Tornado 的基礎 Web 框架

          ? RequestHandler:封裝對請求處理的所有信息和處理方法

          ? get/post/..:封裝對應的請求方式

          ? write():封裝響應信息,寫響應信息的一個方法


          4.2 Tornado.ioloop:核心IO循環模塊,封裝 Linux 的 Epoll 和 BSD 的 kqueue,Tornado 高性能處理的核心。

          ? current()返回當前線程的 IOLoop 實例對象

          ? start()啟動 IOLoop 實力對象的 IO 循環,開啟監聽


          4.3 HttpServer 監聽端口

          ? tornado.httpserver.HTTPServer(app)

          ? httpserver.listen(port)


          4.4 HttpServer 實現多進程操作

          ? tornado.httpserver.HTTPServer(app)

          ? httpserver.bind(port)

          ? httpserver.start(0/None/<0/num)


          Step5:程序結構及說明

          Config.py 配置文件:

          import os
          
          #參數
          param={
              'port':9992,
          }
          
          #配置
          setting={
              "template_path":os.path.join(os.path.dirname(__file__), "templates"),  # 定義視圖頁面地址,放 html文件
              "static_path":os.path.join(os.path.dirname(__file__), "static"),  # 定義靜態模板,放 css,js等文件
              # "debug":True,  # 是否為debug模式
              "autoescape":None,  # 不設置轉義字符
              "autoreload":True,
              "cookie_secret":"QjyutYf0RBW9DRweq4s+TozDU7esgEUTqQy0M6c5II8=",  #安全cookie
              "xsrf_cookies": False,
              "login_url": "/login",
          }


          Application.py 路由配置文件:

          import tornado.web
          import Python_Tornoda.config as config
          from Python_Tornoda.util import mysqldb
          from Python_Tornoda.view.views import MainHandler
          from Python_Tornoda.view.views import LoginHandler
          from tornado.web import StaticFileHandler
          import os
          
          current_path = os.path.dirname(__file__)
          
          class Appliction(tornado.web.Application):
              def __init__(self):
                  handers=[
                      (r"/index/(?P<page>\d*)", MainHandler),
                      (r"/login",LoginHandler),
                      (r'^/(.*?)$', StaticFileHandler,{"path": os.path.join(current_path, "templates"), "default_filename": "main.html"}),
                  ]
                  super(Appliction,self).__init__(handers,**config.setting)


          Views.py視圖函數文件,以“登錄”為示例:

          from Python_Tornoda.util.bussiness import get_data,execute_sql
          from Python_Tornoda.util.Pagination import Pagination
          from tornado.web import RequestHandler
          import time
          
          page_num=5 #每頁展示的條數
          
          #登錄后的主頁
          class MainHandler(RequestHandler):
              def get(self,page):
                  sql1 = "select id,pms_name,content,status,mark,create_time from tornado_info order by create_time desc"
                  itemList = get_data(sql1)
                  print(page)
                  if(int(page)>len(itemList)//page_num):
                      pages=len(itemList)//page_num+1
                  elif(int(page)<1):
                      pages=1
                  else:
                      pages=int(page)
                  print("ad")
          
                  page_obj = Pagination(pages, len(itemList), page_num)
                  current_list = itemList[page_obj.start:page_obj.end]
                  print("00000000000")
                  print(current_list)
                  str_pageCtrl = page_obj.pageCtrl('/index/')
                  self.render('info.html', items=current_list, current_page=page_obj.currentPage, pageCtrl=str_pageCtrl, )
          
          class LoginHandler(RegisterHandler):
              def set_default_headers(self):
                  print('-----set_default_headers:默認設置----')
                  self.set_header('Content-Type', 'application/json')
          
              def initialize(self):
                  print("-----_initialize 初始化操作-----")
                  print("-----_初始化數據庫連接-----")
                  print("-----_初始化打開文件-----")
          
              def prepare(self):
                  print("-----prepare做一些準備工作-----")
                  print("-----加載配置項-----")
          
              def get(self, *args, **kwargs):
                  print("----get 請求處理---")
                  print("----此處需要根據頁面是get請求來進行處理---")
                  username=self.get_query_argument("username")
                  password=self.get_query_argument("password")
                  self.set_secure_cookie(username,password)
                  if(username=="1" and password=="1"):
                      self.redirect("/index/1")
                  else:
                      self.render('main.html')
          
              def post(self,*args,**kwargs):
                  print("----post 請求處理---")
                  print("----此處需要根據頁面是post請求來進行處理---")
                  username = self.get_body_argument("username")
                  password = self.get_body_argument("password")
                  self.set_secure_cookie(username, password)
                  if (username == "1" and password == "1"):
                      self.redirect("/index/1")
                  else:
                      self.render('main.html')
          
              def write_error(self, status_code: int, **kwargs):
                  if(status_code==500):
                      self.write("the server is wrong")
                  elif(status_code==404):
                      self.write("it's not found")
                  else:
                      self.write("the other of error")
          
              def on_finish(self):
                  print("----處理結束,釋放資源----")
                  print("----釋放db連接----")
                  print("----關閉文件句柄----")
          


          Server.py 程序入口文件:

          import tornado.ioloop
          import tornado.web
          import Python_Tornoda.application as app
          import Python_Tornoda.config as config
          
          if __name__ == '__main__':
              print("starting tornado...")
              app = app.Appliction()
              httpServer = tornado.httpserver.HTTPServer(app)
              httpServer.bind(config.param['port'])
              httpServer.start(1)
              tornado.ioloop.IOLoop.current().start()


          Step6:前端代碼

          Login.html:登錄頁代碼

          紅框中可以看得到是用什么方式提交/login

          Index.html: 登錄后的主頁代碼


          Step7:頁面效果

          7.1 登錄頁面展示如下:

          7.2 登錄后主頁面展示如下:

          備注:頁面雖然有些簡陋,但麻雀雖小,五臟俱全。哈哈~

          ornado 簡介

          #python##python自學#

          Tornado 是一個 Python Web 框架,用于開發高性能網絡應用程序。它提供了一組強大的功能,包括非阻塞的 I/O,實時 Web Sockets,和更快的請求處理能力。Tornado 通過使用非阻塞 I/O,允許一個單獨的進程/線程處理數以千計的并發連接,這使得它成為開發高性能網絡應用程序的理想選擇。

          Tornado 是一個開源項目,遵循 Apache 許可證,可以免費使用和貢獻代碼。它還有一個活躍的社區,支持開發人員在使用過程中獲得幫助。

          總的來說,Tornado 是一個適用于開發高性能網絡應用程序的優秀框架,與其他 Web 框架相比具有獨特的優勢,并在社區中享有很高的聲譽。

          Tornado 基本用法

          Tornado 允許您快速開發 Web 應用程序。下面是一個簡單的例子,展示了如何使用 Tornado 創建一個簡單的 "Hello, World!" 應用程序。

          import tornado.ioloop
          import tornado.web
          
          # 定義一個請求處理類,繼承自 tornado.web.RequestHandler
          class MainHandler(tornado.web.RequestHandler):
              # 對于請求的處理方法
              def get(self):
                  # 向客戶端寫入一段文本
                  self.write("Hello, World!")
          
          # 創建一個應用實例,并設置請求的路徑對應的請求處理類
          app = tornado.web.Application([
              (r"/", MainHandler),
          ])
          
          # 啟動 HTTP 服務器
          if __name__ == "__main__":
              app.listen(8888)
              tornado.ioloop.IOLoop.current().start()
          

          運行該代碼后,您可以通過在瀏覽器中訪問 http://localhost:8888 來查看 "Hello, World!" 應用程序的輸出。

          Tornado 高級用法

          Tornado 是一個功能強大的 Web 框架,除了基本的請求處理能力之外,還提供了一些高級功能,如下:

          非阻塞 I/O:Tornado 采用非阻塞 I/O,可以處理大量并發請求。下面是一個簡單的例子,展示了如何使用 Tornado 的非阻塞 I/O:

          import tornado.ioloop
          import tornado.gen
          import tornado.httpclient
          
          # 定義一個請求處理類,繼承自 tornado.web.RequestHandler
          class MainHandler(tornado.web.RequestHandler):
              @tornado.gen.coroutine
              def get(self):
                  # 通過 tornado.httpclient 發送一個非阻塞 HTTP 請求
                  http_client = tornado.httpclient.AsyncHTTPClient()
                  response = yield http_client.fetch("http://www.example.com")
                  self.write(response.body)
          
          # 創建一個應用實例,并設置請求的路徑對應的請求處理類
          app = tornado.web.Application([
              (r"/", MainHandler),
          ])
          
          # 啟動 HTTP 服務器
          if __name__ == "__main__":
              app.listen(8888)
              tornado.ioloop.IOLoop.current().start()
          

          WebSockets:Tornado 支持實時 WebSockets,允許您通過 WebSockets 在客戶端和服務器之間進行實時通信。下面是一個簡單的例子,展示了如何使用 Tornado 的 WebSockets:

          import tornado.ioloop
          import tornado.web
          import tornado.websocket
          
          # 定義一個 WebSocket 處理類,繼承自 tornado.websocket.WebSocketHandler
          class MainHandler(tornado.websocket.WebSocketHandler):
              def open(self):
                  print("WebSocket opened")
          
              def on_message(self, message):
                  self.write_message("You said: " + message)
          
              def on_close(self):
                  print("WebSocket closed")
          
          # 創建一個應用實例,并設置請求的路徑對應的請求處理類
          app = tornado.web.Application([
              (r"/", MainHandler),
          ])
          
          # 啟動 HTTP 服務器
          if __name__ == "__main__":
              app.listen(8888)
              tornado.ioloop.IOLoop.current().start()
          

          認證與授權:Tornado 提供了多種認證和授權的方式,如:Cookie 認證、HTTP 基本認證、OAuth 等。下面是一個簡單的例子,展示了如何使用 Tornado 的 HTTP 基本認證:

          import tornado.ioloop
          import tornado.web
          
          # 定義一個請求處理類,繼承自 tornado.web.RequestHandler
          class MainHandler(tornado.web.RequestHandler):
              @tornado.web.authenticated
              def get(self):
                  self.write("Hello, " + self.current_user)
          
          # 創建一個應用實例,并設置請求的路徑對應的請求處理類
          app = tornado.web.Application([
              (r"/", MainHandler),
          ], cookie_secret="secret", login_url="/login")
          
          # 啟動 HTTP 服務器
          if __name__ == "__main__":
              app.listen(8888)
              tornado.ioloop.IOLoop.current().start()
          

          靜態文件服務:Tornado 提供了一個簡單的方法來為應用的靜態文件提供服務

          import tornado.ioloop
          import tornado.web
          
          # 創建一個應用實例,并設置請求的路徑對應的請求處理類
          app = tornado.web.Application([
              (r"/", tornado.web.RedirectHandler, {"url": "/static/index.html"}),
              (r"/static/(.*)", tornado.web.StaticFileHandler, {"path": "static"}),
          ])
          
          # 啟動 HTTP 服務器
          if __name__ == "__main__":
              app.listen(8888)
              tornado.ioloop.IOLoop.current().start()
          

          這樣,你的應用就可以通過 http://localhost:8888/static/ 來訪問靜態文件了。

          模板:Tornado 提供了一個內置的模板引擎,支持簡單的模板語法。下面是一個簡單的例子:

          import tornado.ioloop
          import tornado.web
          
          # 定義一個請求處理類,繼承自 tornado.web.RequestHandler
          class MainHandler(tornado.web.RequestHandler):
              def get(self):
                  self.render("template.html", title="Tornado Template Example", message="Hello, Tornado!")
          
          # 創建一個應用實例,并設置請求的路徑對應的請求處理類
          app = tornado.web.Application([
              (r"/", MainHandler),
          ], template_path="templates")
          
          # 啟動 HTTP 服務器
          if __name__ == "__main__":
              app.listen(8888)
              tornado.ioloop.IOLoop.current().start()
          

          這樣,你的應用就可以使用模板來生成動態的 HTML 頁面了。

          這些都是 Tornado 的高級用法的一些例子,幫助你快速掌握 Tornado 的開發。希望對你有所幫助。


          主站蜘蛛池模板: 一区一区三区产品乱码| 日本一区频道在线视频| 日本一区二区三区在线视频观看免费 | 精品国产AⅤ一区二区三区4区 | 中文字幕一区二区三区精华液 | 爆乳熟妇一区二区三区霸乳| 亚洲线精品一区二区三区 | 国内精品视频一区二区三区八戒 | 日本v片免费一区二区三区| 久久91精品国产一区二区| 精品国产一区二区三区在线 | 无码精品久久一区二区三区| 相泽南亚洲一区二区在线播放| 国模吧无码一区二区三区| 亚洲AV日韩AV一区二区三曲| 国产精品男男视频一区二区三区 | 91精品国产一区二区三区左线 | 99久久国产精品免费一区二区| 亚洲一区无码中文字幕| 国产高清精品一区| 2014AV天堂无码一区| 日本一区午夜爱爱| 亚洲国产精品一区二区久久hs| 国产成人精品一区二区三区| 无码AV天堂一区二区三区| 精品人妻码一区二区三区| 久久免费区一区二区三波多野| 日韩美女在线观看一区| 夜夜嗨AV一区二区三区| 国产手机精品一区二区| 日韩福利视频一区| 亚洲免费视频一区二区三区| 日韩精品无码一区二区三区不卡| 亚洲电影一区二区三区| 亚洲欧美日韩中文字幕在线一区 | 国精品无码一区二区三区左线| 久久精品人妻一区二区三区 | 伊人久久精品一区二区三区| 精品无码国产AV一区二区三区| 精品女同一区二区三区免费播放| 日韩一区二区三区在线|