Python Web项目Cherrypy使用方法镜像


Posted in Python onNovember 05, 2020

1、介绍

搭建Java Web项目,需要Tomcat服务器才能进行。而搭建Python Web项目,因为cherrypy自带服务器,所以只需要下载该模块就能进行Web项目开发。

2、最基本用法

实现功能:访问html页面,点击按钮后接收后台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>

  <h1>Test Cherry</h1>
  <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能请求到该函数
  def hello_world(self):
    print('Hello')
    return 'Hello World'

  @cherrypy.expose() # 保证html能请求到该函数http://127.0.0.1:8080/index
  def index(self): # 默认页为test_cherry.html
    return open(u'test_cherry.html')


cherrypy.quickstart(TestCherry(), '/')

运行结果

[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

能看到启动的路径为127.0.0.1::8080端口号是8080

The Application mounted at '' has an empty config.表示没有自己配置,使用默认配置,如果需要可自己配置

运行py脚本后,打开浏览器输入http://127.0.0.1:8080/或者http://127.0.0.1:8080/index就可以看到test_cheery.html

Python Web项目Cherrypy使用方法镜像

点击hello_world按钮,就会访问py中的hello_world函数

Python Web项目Cherrypy使用方法镜像

解释:test_cherry.html中

function callHelloWorld() {

$.get('/hello_world', function (data, status) {

alert('data:' + data)

alert('status:' + status)

})}

1)请求/hello_world需要与py中的函数名一致

2)默认端口是8080,如果8080被占用,可以重新配置

cherrypy.quickstart(TestCherry(), '/')可以接收配置参数

若多次调试出现portend.Timeout: Port 8080 not free on 127.0.0.1.错误

是因为8080端口被占用了,如果你第一次调试时成功了,则你可以打开任务管理器把python进程停掉,8080就被释放了

3、导入webbrowser进行调试开发(可以自动打开浏览器,输入网址)

py代码

# -*- encoding=utf-8 -*-

import cherrypy
import webbrowser


class TestCherry():
  @cherrypy.expose() # 保证html能请求到该函数
  def hello_world(self):
    print('Hello')
    return 'Hello World'

  @cherrypy.expose() # 保证html能请求到该函数http://127.0.0.1:8080/index
  def index(self): # 默认页为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) #启动前每次都调用auto_open函数
cherrypy.quickstart(TestCherry(), '/')

这样运行py就能自动打开网页了,每次改变html代码如果没达到预期效果,可以试一试清理浏览器缓存!!!

4、带参数的请求

实现传入参数并接收返回显示在html上

py中添加一个函数(get_parameters)

# -*- encoding=utf-8 -*-

import cherrypy
import webbrowser


class TestCherry():
  @cherrypy.expose() # 保证html能请求到该函数
  def hello_world(self):
    print('Hello')
    return 'Hello World'

  @cherrypy.expose() # 保证html能请求到该函数http://127.0.0.1:8080/index
  def index(self): # 默认页为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) # 启动前每次都调用auto_open函数
cherrypy.quickstart(TestCherry(), '/')

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>

  <h1>Test Cherry</h1>
  <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>

运行结果

点击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"

能看出传入的参数已经打印出来了

Python Web项目Cherrypy使用方法镜像

5、config配置以及对应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': {
      # 主机0.0.0.0表示可以使用本机IP访问,如http://10.190.20.72:8090,可部署给别人访问
      # 否则只可以用http://127.0.0.1:8090
      'server.socket_host': service.host,
      # 端口号
      'server.socket_port': service.port,
      # 当代码变动时,是否自动重启服务,True==是,False==否
      # 设为True时,当该PY代码改变,服务会重启
      'engine.autoreload.on': False
    },
    # 根目录设置
    '/': {
      '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)})
  # 当代码变动时,是否重启服务,True==是,False==否
  # cherrypy.config.update({'engine.autoreload.on': False})
  # 支持http://10.190.20.72:8080/形式
  # cherrypy.server.socket_host = '0.0.0.0'
  # 启动时调用函数
  cherrypy.engine.subscribe('start', service.auto_open)
  cherrypy.quickstart(service, '/', conf)


if __name__ == '__main__':
  pass
  main()

工程文件夹

Python Web项目Cherrypy使用方法镜像

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python正则表达式re模块详解
Jun 25 Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
使用python绘制常用的图表
Aug 27 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 Python
python pandas 对时间序列文件处理的实例
Jun 22 Python
Sanic框架请求与响应实例分析
Jul 16 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 Python
Python中函数参数调用方式分析
Aug 09 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
通过代码简单了解django model序列化作用
Nov 12 Python
Python序列化与反序列化相关知识总结
Jun 08 Python
Python实现异步IO的示例
Nov 05 #Python
Python requests HTTP验证登录实现流程
Nov 05 #Python
Python包资源下载路径报404解决方案
Nov 05 #Python
如何一键升级Python所有包
Nov 05 #Python
python实现磁盘日志清理的示例
Nov 05 #Python
Python常用外部指令执行代码实例
Nov 05 #Python
Python Pandas数据分析工具用法实例
Nov 05 #Python
You might like
php Static关键字实用方法
2010/06/04 PHP
laravel自定义分页效果
2017/07/23 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
javascript 面向对象编程基础 多态
2009/08/21 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
js改变css样式的三种方法推荐
2016/06/28 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
wap手机端解决返回上一页的js实例
2016/12/08 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
python实现文件分组复制到不同目录的例子
2014/06/04 Python
一步步教你用Python实现2048小游戏
2017/01/19 Python
python使用turtle库绘制树
2018/06/25 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
行政助理求职自荐信
2013/10/26 职场文书
留学自荐信写作方法
2014/01/27 职场文书
国际贸易专业个人鉴定
2014/02/22 职场文书
联欢晚会主持词
2014/03/25 职场文书
诚信承诺书范文
2014/03/27 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
国情备忘录观后感
2015/06/04 职场文书
Java界面编程实现界面跳转
2022/06/16 Java/Android