您好,登錄后才能下訂單哦!
Cherrypy在Python Web項(xiàng)目中如何使用?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
1、介紹
搭建Java Web項(xiàng)目,需要Tomcat服務(wù)器才能進(jìn)行。而搭建Python Web項(xiàng)目,因?yàn)閏herrypy自帶服務(wù)器,所以只需要下載該模塊就能進(jìn)行Web項(xiàng)目開發(fā)。
2、最基本用法
實(shí)現(xiàn)功能:訪問html頁面,點(diǎn)擊按鈕后接收后臺(tái)py返回的值
html頁面(test_cherry.html)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Test Cherry</title> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> </head> <body> <h2>Test Cherry</h2> <p id="p1"></p> <button type="button" onclick="callHelloWorld()">hello_world</button> <script> function callHelloWorld() { $.get('/hello_world', function (data, status) { alert('data:' + data) alert('status:' + status) }) } </script> </body> </html>
編寫腳本py
# -*- encoding=utf-8 -*- import cherrypy class TestCherry(): @cherrypy.expose() # 保證html能請(qǐng)求到該函數(shù) def hello_world(self): print('Hello') return 'Hello World' @cherrypy.expose() # 保證html能請(qǐng)求到該函數(shù)http://127.0.0.1:8080/index def index(self): # 默認(rèn)頁為test_cherry.html return open(u'test_cherry.html') cherrypy.quickstart(TestCherry(), '/')
運(yùn)行結(jié)果
[27/May/2020:09:04:42] ENGINE Listening for SIGTERM.
[27/May/2020:09:04:42] ENGINE Bus STARTING
CherryPy Checker:
The Application mounted at '' has an empty config.[27/May/2020:09:04:42] ENGINE Set handler for console events.
[27/May/2020:09:04:42] ENGINE Started monitor thread 'Autoreloader'.
[27/May/2020:09:04:42] ENGINE Serving on http://127.0.0.1:8080
[27/May/2020:09:04:42] ENGINE Bus STARTED
能看到啟動(dòng)的路徑為127.0.0.1::8080端口號(hào)是8080
The Application mounted at '' has an empty config.表示沒有自己配置,使用默認(rèn)配置,如果需要可自己配置
運(yùn)行py腳本后,打開瀏覽器輸入http://127.0.0.1:8080/或者h(yuǎn)ttp://127.0.0.1:8080/index就可以看到test_cheery.html
點(diǎn)擊hello_world按鈕,就會(huì)訪問py中的hello_world函數(shù)
解釋:test_cherry.html中
function callHelloWorld() {
$.get('/hello_world', function (data, status) {
alert('data:' + data)
alert('status:' + status)
})}
1)請(qǐng)求/hello_world需要與py中的函數(shù)名一致
2)默認(rèn)端口是8080,如果8080被占用,可以重新配置
cherrypy.quickstart(TestCherry(), '/')可以接收配置參數(shù)
若多次調(diào)試出現(xiàn)portend.Timeout: Port 8080 not free on 127.0.0.1.錯(cuò)誤
是因?yàn)?080端口被占用了,如果你第一次調(diào)試時(shí)成功了,則你可以打開任務(wù)管理器把python進(jìn)程停掉,8080就被釋放了
3、導(dǎo)入webbrowser進(jìn)行調(diào)試開發(fā)(可以自動(dòng)打開瀏覽器,輸入網(wǎng)址)
py代碼
# -*- encoding=utf-8 -*- import cherrypy import webbrowser class TestCherry(): @cherrypy.expose() # 保證html能請(qǐng)求到該函數(shù) def hello_world(self): print('Hello') return 'Hello World' @cherrypy.expose() # 保證html能請(qǐng)求到該函數(shù)http://127.0.0.1:8080/index def index(self): # 默認(rèn)頁為test_cherry.html return open(u'test_cherry.html') def auto_open(): webbrowser.open('http://127.0.0.1:8080/') cherrypy.engine.subscribe('start', auto_open) #啟動(dòng)前每次都調(diào)用auto_open函數(shù) cherrypy.quickstart(TestCherry(), '/')
這樣運(yùn)行py就能自動(dòng)打開網(wǎng)頁了,每次改變html代碼如果沒達(dá)到預(yù)期效果,可以試一試清理瀏覽器緩存?。?!
4、帶參數(shù)的請(qǐng)求
實(shí)現(xiàn)傳入?yún)?shù)并接收返回顯示在html上
py中添加一個(gè)函數(shù)(get_parameters)
# -*- encoding=utf-8 -*- import cherrypy import webbrowser class TestCherry(): @cherrypy.expose() # 保證html能請(qǐng)求到該函數(shù) def hello_world(self): print('Hello') return 'Hello World' @cherrypy.expose() # 保證html能請(qǐng)求到該函數(shù)http://127.0.0.1:8080/index def index(self): # 默認(rèn)頁為test_cherry.html return open(u'test_cherry.html') @cherrypy.expose() def get_parameters(self, name, age, **kwargs): print('name:{}'.format(name)) print('age:{}'.format(age)) print('kwargs:{}'.format(kwargs)) return 'Get parameters success' def auto_open(): webbrowser.open('http://127.0.0.1:8080/') cherrypy.engine.subscribe('start', auto_open) # 啟動(dòng)前每次都調(diào)用auto_open函數(shù) cherrypy.quickstart(TestCherry(), '/')
html中添加一個(gè)新按鈕和對(duì)應(yīng)按鈕事件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Test Cherry</title> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> </head> <body> <h2>Test Cherry</h2> <p id="p1"></p> <button type="button" onclick="callHelloWorld()">hello_world</button> <button type="button" id="postForParameters">get_parameters</button> <p id="getReturn"></p> <script> function callHelloWorld() { $.get('/hello_world', function (data, status) { alert('data:' + data) alert('status:' + status) }) } $(document).ready(function () { $('#postForParameters').click(function () { alert('pst') $.post('/get_parameters', { name: 'TXT', age: 99, other: '123456' }, function (data, status) { if (status === 'success') { $('#getReturn').text(data) } }) }) }) </script> </body> </html>
運(yùn)行結(jié)果
點(diǎn)擊get_parameters按鈕后
D:\Python37_32\python.exe D:/B_CODE/Python/WebDemo/test_cherry.py
[27/May/2020:09:58:40] ENGINE Listening for SIGTERM.
[27/May/2020:09:58:40] ENGINE Bus STARTING
CherryPy Checker:
The Application mounted at '' has an empty config.[27/May/2020:09:58:40] ENGINE Set handler for console events.
[27/May/2020:09:58:40] ENGINE Started monitor thread 'Autoreloader'.
[27/May/2020:09:58:41] ENGINE Serving on http://127.0.0.1:8080
[27/May/2020:09:58:41] ENGINE Bus STARTED
127.0.0.1 - - [27/May/2020:09:58:41] "GET / HTTP/1.1" 200 1107 "" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
127.0.0.1 - - [27/May/2020:09:59:37] "GET / HTTP/1.1" 200 1136 "" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
127.0.0.1 - - [27/May/2020:09:59:37] "GET /favicon.ico HTTP/1.1" 200 1406 "http://127.0.0.1:8080/" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
127.0.0.1 - - [27/May/2020:10:02:50] "GET / HTTP/1.1" 200 1208 "" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
127.0.0.1 - - [27/May/2020:10:02:50] "GET /favicon.ico HTTP/1.1" 200 1406 "http://127.0.0.1:8080/" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
name:TXT
age:99
kwargs:{'other': '123456'}
127.0.0.1 - - [27/May/2020:10:02:54] "POST /get_parameters HTTP/1.1" 200 22 "http://127.0.0.1:8080/" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
能看出傳入的參數(shù)已經(jīng)打印出來了
5、config配置以及對(duì)應(yīng)url(追加,所以代碼不同了)
# -*- encoding=utf-8 -*- import json import os import webbrowser import cherrypy class Service(object): def __init__(self, port): self.media_folder = os.path.abspath(os.path.join(os.getcwd(), 'media')) self.host = '0.0.0.0' self.port = int(port) self.index_html = 'index.html' pass @cherrypy.expose() def index(self): return open(os.path.join(self.media_folder, self.index_html), 'rb') def auto_open(self): webbrowser.open('http://127.0.0.1:{}/'.format(self.port)) @cherrypy.expose() def return_info(self, sn): cherrypy.response.headers['Content-Type'] = 'application/json' cherrypy.response.headers['Access-Control-Allow-Origin'] = '*' my_dict = {'aaa':'123'}# 或者用list[]可保證有序 return json.dumps(my_dict).encode('utf-8') def main(): service = Service(8090) conf = { 'global': { # 主機(jī)0.0.0.0表示可以使用本機(jī)IP訪問,如http://10.190.20.72:8090,可部署給別人訪問 # 否則只可以用http://127.0.0.1:8090 'server.socket_host': service.host, # 端口號(hào) 'server.socket_port': service.port, # 當(dāng)代碼變動(dòng)時(shí),是否自動(dòng)重啟服務(wù),True==是,F(xiàn)alse==否 # 設(shè)為True時(shí),當(dāng)該P(yáng)Y代碼改變,服務(wù)會(huì)重啟 'engine.autoreload.on': False }, # 根目錄設(shè)置 '/': { 'tools.staticdir.on': True, 'tools.staticdir.dir': service.media_folder }, '/static': { 'tools.staticdir.on': True, # 可以這么訪問http://127.0.0.1:8090/static加上你的資源,例如 # http://127.0.0.1:8090/static/js/jquery-1.11.3.min.js 'tools.staticdir.dir': service.media_folder }, } # 可以使用該種寫法代替config配置 # cherrypy.config.update( # {'server.socket_port': service.port}) # cherrypy.config.update( # {'server.thread_pool': int(service.thread_pool_count)}) # 當(dāng)代碼變動(dòng)時(shí),是否重啟服務(wù),True==是,F(xiàn)alse==否 # cherrypy.config.update({'engine.autoreload.on': False}) # 支持http://10.190.20.72:8080/形式 # cherrypy.server.socket_host = '0.0.0.0' # 啟動(dòng)時(shí)調(diào)用函數(shù) cherrypy.engine.subscribe('start', service.auto_open) cherrypy.quickstart(service, '/', conf) if __name__ == '__main__': pass main()
工程文件夾
看完上述內(nèi)容,你們掌握Cherrypy在Python Web項(xiàng)目中如何使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。