• [问题求助] 请问L实例上websocket服务协议是不是默认关闭的?
    前端通过const ws = new WebSocket('ws://websocket'); 访问后端,返回失败,直接进入onerrorusted: truebubbles: falsecancelBubble: falsecancelable: falsecomposed: falsecurrentTarget: WebSocket {url: 'ws://websocket', readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}defaultPrevented: falseeventPhase: 0returnValue: truesrcElement: WebSocket {url: 'ws://websocket', readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}target: WebSocket {url: 'ws://websocket', readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}timeStamp: 203.5type: "error"
  • [问题求助] 请教前端fetch后端报ERR_CONNECTION_REFUSED,但在服务器直接curl后端api成功
    会是什么问题导致的?会不会是安全组设置错误导致的?非常感谢!
  • [问题求助] Flask能否返回一个html带上一个参数呢?
    @app.route('/uploader',methods=['GET','POST'])def uploader(): if request.method == 'POST': f = request.files['file'] print(request.files) f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename))) return 'file uploaded successfully' else: return render_template('upload.html')像这样的Flask代码,它返回一个字符串或者返回一个html(都会打开一个新页面)那我如何返回html的同时,也带一个字符串参数呢?然后在新的html页面里,如何在新的请求中加上这个字符串参数呢?感谢!
  • [技术干货] Python的flask常用函数route()【转】
    目录一、route()路由概述二、静态路由和动态路径方式1:静态路由方式2:动态路由三、route()其它参数1.methods=[‘GET’,‘POST’]一、route()路由概述功能:将URL绑定到函数路由函数route()的调用有两种方式:静态路由和动态路由二、静态路由和动态路径方式1:静态路由@app.route(“/xxx”) xxx为静态路径 如::/index / /base等,可以返回一个值、字符串、页面等12345678910111213from flask import Flaskapp = Flask(__name__) @app.route('/hello')def hello_world():    return 'Hello World!!!'     @app.route('/pro')def index():    return render_template('login.html') if __name__ == '__main__':    app.run(debug = True)方式2:动态路由采用<>进行动态url的传递@app.route(“/”),这里xxx为不确定的路径。123456789from flask import Flaskapp = Flask(__name__) @app.route('/hello/<name>')def hello_name(name):   return 'Hello %s!' % name if __name__ == '__main__':   app.run(debug = True)如果浏览器地址栏输入:http:// localhost:5000/hello/w3cschool则会在页面显示:Hello w3cschool!三、route()其它参数1.methods=[‘GET’,‘POST’]当前视图函数支持的请求方式,不设置默认为GET请求方式不区分大小写methods=[‘GET’] 支持的请求方法为GETmethods=[‘POST’] 支持的请求方法为POSTmethods=[‘GET’,‘POST’] 支持的请求方法为POST GET123456789101112@app.route('/login', methods=['GET', 'POST'])  # 请求参数设置不区分大小写,源码中自动进行了upperdef login():    if request.method == 'GET':        return render_template('login.html')    elif request.method == 'POST':        username = request.form.get('username')        pwd = request.form.get('pwd')        if username == 'yang' and pwd == '123456':            session['username'] = username            return 'login successed 200  ok!'        else:            return 'login failed!!!'
  • [技术干货] Python使用Flask Migrate模块迁移数据库【转】
    前言安装初始化项目结构三大命令前言本篇文章,阐述一下Flask中数据库的迁移为什么要说数据库迁移呢?比如我们以前有一个数据库,里面的信息有 id, name现在我想再加一个gender属性,应该怎么办呢?不可能直接把数据库删除掉吧。然后重新创建一个,因此本文介绍一种,通过数据库迁移的方法,可以保留原始的数据,并完成添加新的一列的方法。安装直接使用pip install flask-migrate即可初始化项目结构123# exts.pyfrom flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()老样子,我们还是在exts.py中,初始我们的数据库,这里时放Flask扩展的地方。1234567# models.pyfrom exts import dbclass User(db.Model):    id = db.Column(db.Integer,primary_key=True)    username = db.Column(db.String(80),unique=True)    def __repr__(self):        return '<User %s>' % self.usernamemodels.py是放模型的地方。1234567891011# app.pyfrom flask import Flaskfrom exts import dbfrom flask_migrate import Migrateapp = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///foo.db"# !!!绑定app和数据库db.init_app(app)migrate = Migrate(app,db)if __name__ == '__main__':    app.run()主程序,我们在!!!进行初始化数据库迁移的migrate 对象。初始化之后我们可以执行下面的三大命令去创建我们的数据库。就不需要db.create_all()命令啦。三大命令# (1)初始化flask db init# 把当前的模型添加到迁移文件flask db migrate# 将映射文件真正的映射到数据库中flask db upgrade(1)新建一个名字为migrations的文件夹,并且记录一个数据库版本号其他问题:如果报错[flask_migrate] Error: Can‘t locate revision identified by '409392ed6301'答:db revision --rev-id 409392ed6301 409392ed6301是问题的版本号Error: While importing ‘app’, an ImportError was raised.答:请先去运行一下app.py,确保app.py可以运行Error: Could not locate a Flask application. You did not provide the “FLASK_APP” environment variable, and a “wsgi.py” or “app.py” module was not found in the current directory. 答:请确保执行命令时的文件夹中有app.py文件
  • [技术干货] Python Flask中Cookie和Session区别详解【转】
    目录前言安装创建虚拟环境进入虚拟环境安装 flaskCookie的使用Session的使用前言本篇文章,阐述一下Flask中Cookie和Session为什么要说Cookie和Session呢?答:因为http请求是无状态的,怎么理解呢?当你访问B站时,如果你没有Cookie或者Session,B站就认为你是一个没有登录的用户。如果你有Cookie或Session,那么B站就知道你登录了,并且知道你是谁。所以可以把跟你相关的资料返回给你两者的区别:答:Cookie是明文,Session是加密的Cookie。安装创建虚拟环境123mkdir myprojectcd myprojectpython3 -m venv venv进入虚拟环境1. venv/bin/activate安装 flask1pip install FlaskCookie的使用12345678910111213141516from flask import Flask, Response, requestapp = Flask(__name__)@app.route("/set_cookie")def set_cookie():    response = Response("set cookie success")    response.set_cookie("user_id","123")    return response@app.route("/get_cookie")def get_cookie():    cookies = request.cookies    if cookies.get("user_id") == "123":        return "尊敬的用户你好,你的cookies是" + str(cookies)    else:        return "你不是VIP,请先获取身份"if __name__ == "__main__":    app.run(debug=True,port=5000)第一次首先访问/home地址,会发现你没有Cookie给你返回一个你不是VIP,请先获取身份但是当我们首先访问/set_cookie,我们就会获得一个cookie,然后我们在访问/home地址,就可以成功的显示尊敬的用户您好了Session的使用12345678910111213141516from flask import Flask, sessionapp = Flask(__name__)# !!!你需要设置一个SECRET_KEY用来加密Cookieapp.config["SECRET_KEY"] = "123"@app.route("/set_session")def set_session():    session["user_name"] = "zhuxiaoxiao"    return "设置session成功" + session["user_name"]@app.route("/home")def home():    if session.get("user_name") == "zhuxiaoxiao":        return "尊敬的用户,登录成功"    else:        return "请先登录好吗?"if __name__ == "__main__":    app.run(debug=True,port=5000)Session的使用方式整体和Cookie是一样的。需要注意的是使用Session前,必须要进行设置SECRET_KEY,用来加密Cookie
  • [技术干货] 首发】flask 实现ajax 数据入库,并掌握文件上传[转载]
    lask 实现ajax 数据入库在正式编写前需要了解一下如何在 python 函数中去判断,一个请求是 get 还是 post。python 文件代码如此所示:# route()方法用于设定路由; @app.route('/hello.html', methods=['GET', 'POST']) def hello_world(): if request.method == 'GET': # args = request.args return render_template('hello.html') if request.method == "POST": print("POST请求")上述代码通过 requests.method 属性判断当前请求类型,然后实现相应的逻辑。注意上述内容中的 @app.route('/hello.html', methods=['GET', 'POST']) ,绑定的方法由参数 methods 决定。HTML 页面代码如下所示:<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>这是第一个HTML页面</title> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> </head> <body> {{name}} <input type="button" value="点击发送请求" id="btn" /> <script> $(function() { $('#btn').on('click', function() { alert($(this).val()); }); }) </script> </body> </html>在 HTML 页面中提前导入 jquery 的 CDN 配置,便于后续实现模拟请求操作。再次完善一些 POST 请求的相关参数判断,通过 requests.form 获取表单参数。# route()方法用于设定路由; @app.route('/hello.html', methods=['GET', 'POST']) def hello_world(): if request.method == 'GET': args = request.args name = args.get('name') return render_template('hello.html',name=name) if request.method == "POST": print("POST请求") arges = request.form print(arges) return "PPP"同步修改一下前端请求部分,这里改造主要需要的是前端知识。<body> {{name}} <input type="button" value="点击发送请求" id="btn" /> <script> $(function() { $('#btn').on('click', function() { //alert($(this).val()); $.post('./hello.html', function(result) { console.log(result); }) }); }) </script> </body>测试的时候同步开启浏览器的开发者工具,并且切换到网络请求视图,查看请求与返回数据。数据传递到后台之后,只需要使用上一篇博客涉及的内容即可将数据存储到 MySQL 中。实现文件上传了解了POST请求之后,就可以通过该模式实现文件上传操作了。优先修改 HTML 页面,实现一个文件选择按钮。<input type="file" id="file" /> <script type="text/javascript"> $(function() { $('#btn').on('click', function() { //alert($(this).val()); $.post('./hello.html', function(result) { console.log(result); }) }); var get_file = document.getElementById("file"); get_file.onchange = function(e) { file = e.currentTarget.files[0]; //所有文件,返回一个数组 var form_data = new FormData(); form_data.append("file", file); console.log(form_data); form_data.append("file_name", e.currentTarget.files[0].name); $.ajax({ url: '/upload', type: 'post', data: form_data, contentType: false, processData: false, success: function(res) { console.log(res.data); } }); } }) </script>服务端处理文件的代码如下所示@app.route('/upload', methods=['POST'], strict_slashes=False) def upload(): if request.method == "POST": print("POST请求") file = request.files.get('file') name = request.form.get('file_name') print(name) file.save("./"+name) # print(name) return "PPP"这里需要注意的是如果 Python 端存在BUG,前端的AJAX请求会出现 400或者500错误。文件名通过前端传递 file_name 参数获取。本案例可以扩展上传成功之后,返回JSON数据到前端进行后续处理。项目在实测的过程中发现一个问题,在读取前台传递的文件流时,需要使用 request.files.get() 方法实现,而不能用 request.form['参数名'] 。原文链接:https://bbs.huaweicloud.com/blogs/334929
  • [技术干货] 利用Nginx+ Flask +MySQL+ Redis,部署一个从Docker到Docker-Compose的应用
    应用概述:把一个Flask项目的MySQL数据库、Redis数据库、Flask应用、Nginx服务分别装到四个容器中,然后用Docker-Compose命令同时启动与关闭。   Flask 技术   Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。 Flask是基于Python开发的框架,类似的框架还有Django、Tornado等,相比于另外两个框架Flask因为灵活、轻便且高效的特点被业界认可,同时拥有基于Werkzeug、Jinja2等一些开源库,拥有内置服务器和单元测试,适配RESTful,支持安全的cookies。并且Flask中拥有灵活的Jinja2模板引擎,提高了前端代码的复用率。这样可以提高开发效率和有利于后期开发与维护。   Redis技术   Redis是一个开源(BSD 许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过 Redis Sentinel提供高可用,通过 Redis Cluster 提供自动分区。Redis是一个高性能的key-value 数据库。Redis的出现,很大程度补偿了memcached 这类 key/value 存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了 Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。   MySQL技术   MySQL 是一款安全、跨平台、高效的,并与PHP、Java等主流编程语言紧密结合的数据库系统。目前 MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,使得很多公司都采用 My SQL 数据库以降低成本。MySQL 数据库可以称得上是目前运行速度最快的SQL语言数据库之一。 除了具有许多其他数据库所不具备的功能外,MySQL 数据库还是一种完全免费的产品,用户可以直接通过网络下载MySQL数据库,而不必支付任何费用。   Nginx技术    Nginx (engine x) 是一个高性能的 HTTP和反向代理服务。Nginx是一个很强大的高性能 Web和反向代理服务,它具有很多非常优越的特性,时常用于服务端的反向代理和负载均衡。它的内存占用少,启动极快,高并发能力强。在连接高并发的情况下,Nginx是 Apache 服务不错的替代品。   步骤概述   一、安装DockerDocker 运行在 CentOS7 上,要求系统为64位、系统内核版本为 3.10 以上。通过 uname -r 命令查看当前的内核版本。二、只用Docker部署首先先把MySQL和Redis数据库跑起来部署Flask应用部署Nginx注意区分:Docker镜像是一个模版,Docker容器是一个实例,它可以被启动与关闭。三、Docker-Compose部署Docker-Compose可以很方便地通过一个文件构建多个镜像、启动多个容器。    智能云网   智能云网社区是华为专为开发者打造的“学习、开发、验证、交流”一站式支持与服务平台,该平台涵盖多领域知识。目前承载了云园区网络,云广域网络,数通网络开放可编程,超融合数据中心网络,数通网络设备开放社区共五个场景。为了响应广大开发者需求,还提供了开发者交流、API 体验中心、多媒体课件、SDK工具包、开发者工具以及远程实验室共六大工具,让开发者轻松开发。欢迎各位前来体验。>>戳我了解更多<<
  • [问题求助] 【atlas 200dk】【flask服务功能】初始化模型成功,第一次调用成功,但是第二次继续调用报错
    【功能模块】atlas 200dk flask服务【操作步骤&问题现象】1、采用flask在atlas 200 dk 上面搭建一个人脸录入算法功能,目的是可以连续多次录入人脸2、问题:模型初始化成功,采用postman进行第一次算法调用,录入人脸成功,但是想继续第二次调用算法时,报错【截图信息】图1:第一次调用算法成功图二,第二次调用算法报错,根据打印信息,推测是第二次调用算法时,初始化有问题【其他信息】(可选,上传日志内容或者附件)图3,模型初始化代码,只初始化一次图4,引发报错的相关代码,初步分析是第二次调用算法时,acl.rt.memcpy()方法有问题
  • [技术干货] 如何在HiLens Studio中测试网络通信(requests/flask)
    很多真实场景中,常常需要将某处的处理结果通过网络发送到另一处,例如在HiLens Kit中进行视频AI分析(如安全帽检测)后,将分析结果(如未佩戴安全帽告警)发送到后台业务系统。在真实的设备上只要配置好网络,这样的需求很容易实现(例如,服务器端使用flask开启http server,客户端使用requests发送数据),但是在HiLens Studio中,由于一些外部网络请求被限制,是无法自由的将数据发送到外部服务器的,有什么方法进行模拟测试呢?其实除了这篇帖子中的方案(https://bbs.huaweicloud.com/forum/thread-108123-1-1.html),还有一个简单的方法可以试试:1. 新建一个服务器端模拟技能,使用flask开启http server,设定某个端口(如 3333);2. 再建一个客户端模拟技能,使用requests发送数据,url指定为http://127.0.0.1:3333;这样就可以在两个技能间通信了。当然,需要事先在Studio的Terminal中用 pip3 install flask --user 和 pip3 install requests --user 安装flask和requests包才可以运行那两个技能。服务器端技能示例代码如下:#! /usr/bin/python3.7 import os # 需求事先在Terminal中用 pip3 install flask --user 安装 from flask import Flask from flask import request import json app = Flask(__name__) @app.route("/", methods=['POST', 'GET']) def hello(): # 接收到的json信息转为dict result_dict = json.loads(request.get_data().decode()) print(result_dict) def run(work_path): app.run(host="0.0.0.0", port="3333") if __name__ == "__main__": run(os.getcwd())客户端技能代码示例如下:#! /usr/bin/python3.7 import os import json import time # 需求事先在Terminal中用 pip3 install requests --user 安装 import requests def run(work_path): index = 0 while True: index += 1 post_data = {'test_int': index} ret = requests.post('http://127.0.0.1:3333', json.dumps(post_data).encode('utf-8')) print(post_data) print(ret) time.sleep(1) if __name__ == "__main__": run(os.getcwd())
  • [问题求助] 【Atlas 200DK】【调用模型】flask内接收到请求时初始化模型不成功
    【功能模块】【操作步骤&问题现象】1、我把model里面的__del__()做了名为destroy()的封装我通过图一的方式想在每次接收到请求后调用模型推理返回结果,在@app.route外部是可以反复加载成功执行的,但是在内部接收到请求时调用就会产生acl.mdl.load_from_file failed ret=500002的错误,如图二图三所示2、请问这是为什么呢,从根本上就无法在每次收到请求时初始化模型吗?如果没有办法的话有没有只初始化模型一次然后传入app.route内部每次调用的方法呢?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] python+flask编写一个简单的登录接口
    在学习接口测试的时候往往会因为没有实际操作的接口进行测试而烦恼,这里教大家自己编写两个接口用于学习接口测试1、编写一个登录的接口2、在pycharm运行3、使用apipost进行登录接口测试输入url和参数值进行访问,访问成功。4、在pycharm查看是否正常进行访问5、在编写一个需要登录返回的token直接访问的查询接口6、运行登录和查询两个接口7、使用apipost进行登录和查询的接口测试首先进行登录的接口测试获取返回的token使用登录返回的token值进行查询的接口测试8、使用的工具接口编写工具:python、pycharm、flask框架接口测试工具:apipost接口测试工具下载地址:https://www.apipost.cn