flask实际开发:flask和nginx如何配置支持websocket

news2024/11/17 15:39:45

使用pycharm启动flask项目有坑,先修改pycharm设置

1、点击Edit Confiturations

2、配置启动方式

1 新增启动配置
2 选择使用python命令执行
3 给配置设置一个名字
4 设置要启动的模块的位置,flask基本都是app.py 模块

最后别忘记:点击右侧的apply

一、flask

1.1、flask框架配置支持websocket

依赖包:

pip install gevent-websocket==0.10.1
pip install gevent==21.1.2
pip install flask==1.1.2

1、配置方式一:使用到gevent-websocket 和gevent 共同实现

import time

import gevent
from gevent.pywsgi import WSGIServer
from  geventwebsocket.handler import WebSocketHandler
from gevent import monkey
monkey.patch_all()
from numpy import random
from flask import Flask ,json,Response,render_template,jsonify
from src.app import app

@app.route('/ws')
def ws():
	sock = request.environ.get('wsgi.websocket')
	while True:
        msg = socke.receive()
        print('客户端发送的信息:',msg)
        if msg == None:
            print('客户端结束websocket连接')
            break
		socke.send(f'接收到的时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')

	return 'ok'

if __name__ == '__main__':
    #使用WSGIServer使用项目支持sse,支持websocket
    ser = WSGIServer(('0.0.0.0',8888),app,handler_class=WebSocketHandler)
    ser.serve_forever()

2、配置二:只使用gevent-websocket包

import time
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.server import WSGIServer
from geventwebsocket.websocket import WebSocket #语法提示
from flask import Flask
from flask import request
import time
print('flask启动...')
app = Flask(__name__)

@app.route('/ws')
def ws():
    sock = request.environ.get('wsgi.websocket')
    print(sock)
    while True:
        msg = sock.receive()
        print(msg,'接收到的数据')
        if msg==None:
            break
        sock.send(f'收到数据的时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')
    return 'ok'

if __name__ == '__main__':
    #使用WSGIServer使用项目支持sse,支持websocket
    ser = WSGIServer(('0.0.0.0',8888),app,handler_class=WebSocketHandler)
    ser.serve_forever()

1.2、通过python脚本发起websocket

依赖包:

pip3 install websocket-client

当nginx配置了证书,走https协议时,使用 wss://域名:443/api/ws 

from websocket import create_connection
import websocket

def main():
    #ambulance.thearay.net:443
    url = 'wss://ambulance.jinho.net:443/api/websocket/ws'
    ws = create_connection(url)
    print("获取连接状态:", ws.connected)
    while True:
        send_data = input('>>>>>>>>')
        print(f'send >>> {send_data}')
        ws.send(f"{send_data.strip()}")
        response = ws.recv()
        print("recv >>> ", response)
        if response =='close':
            break
    ws.close()

if __name__ == '__main__':
    main()

当nginx没有配置证书,走http协议时,使用ws://域名:80/api/ws

from websocket import create_connection
def main():
    url = 'ws:/ambulance.jinho.net:80/api/ws'
    ws = create_connection(url)
    print("获取连接状态:", ws.connected)
    while True:
        data = input('发送数据>>>>')
        ws.send(data)
        response = ws.recv()
        print("接收数据>>>>", response)
        if response=='close':
            ws.close()
if __name__ == '__main__':
    main()

二、nginx

最主要就是在代理flask请求的配置中,配置下面三个

 location /api/{

         proxy_pass http://127.0.0.1:8888/api/;

         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";

}

https配置

 server {
    	listen 443 ssl;
	    server_name 127.0.0.1;
    	ssl_certificate cert/8386707_ambulance.jinho.net.pem;
    	ssl_certificate_key cert/8386707_ambulance.jinho.net.key;
   	    ssl_session_timeout 5m;
    	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    	ssl_prefer_server_ciphers on;
    	client_max_body_size 10m;


	    location  /static  {
		    alias  C:/5G/5GApi/static; 
		}

	    location / {
		    root   C:\\5G\\nginx-1.17.8\\dist; #默认访问目录
            index  index.html;
		    # try_files $uri $uri/ /index.html;
		}

	    location /api/ {
		       #后端
		  
		       proxy_pass http://127.0.0.1:8888/;
		       proxy_buffering off; #nginx实现sse的功能,不配置就无法实现sse功能

		       #nginx配置支持websocket,下面三条
    	       proxy_http_version 1.1;
    	       proxy_set_header Upgrade $http_upgrade;
   	 	       proxy_set_header Connection "upgrade";
		   
               #websocket的超时处理
		       proxy_read_timeout 600s;
               proxy_connect_timeout 30s;
               proxy_send_timeout 60s;
		  }
	
#server的括号
    }

走http协议

 server {
    	listen 80;
	    server_name 127.0.0.1;
    	client_max_body_size 10m;
        root html;
        index index.html index.htm;

	    location  /static  {
		    alias  C:/5G/5GApi/static; 
		}

	    location / {
		    root   C:\\5G\\nginx-1.17.8\\dist; #默认访问目录
            index  index.html;
		    # try_files $uri $uri/ /index.html;
		}

	    location /api/ {
		       #后端
		  
		       proxy_pass http://127.0.0.1:8888/;
		       proxy_buffering off; #nginx实现sse的功能,不配置就无法实现sse功能

		       #nginx配置支持websocket,下面三条
    	       proxy_http_version 1.1;
    	       proxy_set_header Upgrade $http_upgrade;
   	 	       proxy_set_header Connection "upgrade";
		   
               #websocket的超时处理
		       proxy_read_timeout 600s;
               proxy_connect_timeout 30s;
               proxy_send_timeout 60s;

		  }

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络-传输层UDP/TCP详解

目录 计算机网络的层状结构 UDP协议 UDP报文格式 理解UDP/TCP报文的本质 UDP的特点 UDP的缓冲区 sendto/recvfrom/send/recv/write/read IO类接口 UDP是全双工的 UDP注意事项 UDP协议,实现简单聊天室(服务端客户端) TCP协议 TCP协…

SpringBoot集成 ElasticSearch

Spring Boot 集成 ElasticSearch 对于ElasticSearch比较陌生的小伙伴可以先看看ElasticSearch的概述ElasticSearch安装、启动、操作及概念简介 好的开始啦~ 1、基础操作 1.1、导入依赖 <dependency><groupId>org.springframework.boot</groupId><arti…

【是C++,不是C艹】 第一个C++程序 | 命名空间 | 输入输出

&#x1f49e;&#x1f49e; 欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e; &#x1f449;专栏&#xff1a;《是C&#xff0c;不是C艹》&#x1f448; 前言&#xff1a; 在认识了C的来历之后&#xff0c;我们就要开始正式学习C了&#xff0c;系好安全带&#xff0c;准备…

阿里云安全ACP认证考试实验之云盾之云安全中心与态势感知入门体验

“更多玩转云产品” 1、实验概述 通过本实验可对云安全中心&#xff0c;态势感知的一些基本操作有深入了解以及如何来对实例进行安全监控 2、实验目标 完成此实验可以掌握的能力有&#xff1a; 在安骑士中添加白名单、登录安全设置 通过态势感知查看实例的相关告警威胁 3…

数值区间的模糊匹配,二分查找的应用

先看图: 需求很明确,要根据左边的值,显示右边的值。 比如,现在拿到的值是 17.12,那么应该显示成 15;拿到 17.599 ,那么应该显示成 20. 先找规律: 为了便于说明,暂且将左边的值设为 x, 右边的值设为 y. 第一行和最后一行可以写死成 0 与 1500;余下的每行,x 的区间是…

Vue CLI 创建一个项目

vue create 运行以下命令来创建一个新项目&#xff1a; vue create hello-world警告 如果你在 Windows 上通过 minTTY 使用 Git Bash&#xff0c;交互提示符并不工作。你必须通过 winpty vue.cmd create hello-world 启动这个命令。不过&#xff0c;如果你仍想使用 vue crea…

发布会前准备新闻通稿的重要性,为什么媒体不会原稿发布报道?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体 胡老师。 最近有宣传的小伙伴问胡老师&#xff0c;为什么我们精心准备的新闻通稿&#xff0c;媒体没有按照稿子发布呢&#xff1f;今天就与大家交流下这方面的经验。 一&#xff0c;发布会前准备新…

中断嵌套实验

使用汇编语言&#xff0c;要求&#xff1a; 外部中断1可以嵌套外部中断0 没有中断时&#xff0c;8个LED发光二极管以0.1s的速度闪烁。 有外部中断0时&#xff0c;8个LED发光二极管以0.1s的速度流水点亮。&#xff08;中断子程序0&#xff09; 有外部中断1时&#xff0c;会打断外…

还在为招生发愁?一文get中外合办院校招生技巧

生源&#xff0c;是任何一所高校的生存之本和生命线。因此&#xff0c;正确的招生策略&#xff0c;对于院校来说显得格外重要。 近几年&#xff0c;越来越多的家长和学生开始关注中外合办大学&#xff0c;随之而来的中外合办大学的生源竞争也越来越激烈。那么&#xff0c;有哪…

学好虚拟化,首先要学Linux

上次讲到了虚拟化的基础知识&#xff0c;比如虚拟化的应用、各个厂商都是通过何种技术路径来实现的等等&#xff0c;本篇想记录一下我学习到的CPU内存虚拟化和网络虚拟化相关知识&#xff0c;通过记录来制造反馈&#xff0c;让自己更有效地学习。需要注意的是&#xff0c;学习虚…

这 7个 AI 写作助手,太实用了

想象一下&#xff1a;你正在办公桌前为你的广告输入标题&#xff0c;但你突然思维阻塞并卡住了&#xff0c;可惜这时还没有神奇的软件可以帮助你想出点子。或许是有的&#xff1f; 2023 年&#xff0c;AI 写作工具似乎不可避免地会很快融入我们的工作流程中。现代知识工作者已…

政府大数据中心数据资源平台建设方案WORD2022

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 1.1 项目建设内容 对于本次区级大数据资源平台的建设&#xff0c;将按照“总体规划一步到位&#xff0c;平台建设分步实施&#xff0c;数据赋能逐步升级”的原则&#xff0c;落…

理解什么是DTO?什么是AutoMapper?

什么是DTO? .Net DTO是一个对象&#xff0c;它定义了数据如何在网络上发送。它只用于发送和接收数据&#xff0c;不包含任何业务逻辑。使用DTO的原因有以下几个&#xff1a; 将服务层与数据库层分离隐藏客户端不需要查看的特定属性省略一些属性以减少有效负载大小处理嵌套对象…

【LeetCode: 233. 数字 1 的个数 | 暴力递归=>记忆化搜索=>动态规划 | 数位dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别

1、Term Suggester term suggester 正如其名&#xff0c;只基于 tokenizer 之后的单个 term 去匹配建议词&#xff0c;并不会考虑多个term之间的关系 POST <index>/_search { "suggest": {"<suggest_name>": {"text": "<s…

VM——VMware装Centos

一、创建虚拟机配置 打开VMware&#xff0c;创建新虚拟机 选择自定义&#xff0c;下一步 选择16.x&#xff0c;然后下一步 选择稍后安装&#xff0c;然后下一步 选择Linux、镜像版本&#xff0c;然后下一步 输入虚拟机名称&#xff0c;选择存放位置&#xff0c;然后下一步 选择…

串口UART介绍

【记录所学】 1. 串口的硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter&#xff0c;即异步发送和接收。串口在嵌入式中用途非常的广泛&#xff0c;主要的用途有&#xff1a; 打印调试信息&#xff1b;外接各种模块&#xff1a;GPS、蓝牙&#xff1b…

【java web篇】MyBatis实现增删改查

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

Git使用教程:从入门到精通(以Gitee为例)

一、前言 Git是一款分布式版本控制系统&#xff0c;可以帮助开发者更好地管理代码。在众多的Git平台中&#xff0c;Gitee是国内最受欢迎的Git平台之一。本篇文章将介绍如何使用Git进行代码管理&#xff0c;并以Gitee为例&#xff0c;详细讲解Git的基本操作和常用命令。 二、深入…

JS学习笔记(一)

从编程模式看&#xff1a;JS是结构化、事件驱动的动态语言&#xff0c;支持声明式和指令式两种模式&#xff0c;所以JS是一个多模式的语言。面向对象和函数式是常用的两种模式。 函数式编程 基本概念&#xff1a;函数是什么&#xff1f;函数是数据集到目标的一种关系。在函数式…