【flask学习笔记】flask与HTTP,flask与mongodb交互,用手机输入局域网ip访问flask界面

2023-05-16

文章目录

  • 引入(关于http)
  • flask项目的配置

引入(关于http)

当我们在浏览器中的地址栏中输入这个URL,然后按下Enter时,稍等片刻,浏览器会显示一个问候页面。这背后有一个程序运行着。它负责接收用户的请求,并把对应的内容返回给客户端,显示在用户的浏览器上。事实上,每一个Web应用都包含这种处理模式,即“请求-响应循环(Request-Response Cycle)”:客户端发出请求,服务器端处理请求并返回响应,
flask web的工作流程:
在这里插入图片描述
从图中可以看出,HTTP在整个流程中起到了至关重要的作用,它是客户端和服务器端之间沟通的桥梁。 当用户访问一个URL,浏览器便生成对应的HTTP请求,经由互联网发送到对应的Web服务器。Web服务器接收请求,通过WSGI将HTTP格式的请求数据转换成我们的Flask程序能够使用的Python数据。在程序中,Flask根据请求的URL执行对应的视图函数,获取返回值生成响应。响应依次经过WSGI转换生成HTTP响应,再经由Web服务器传递,最终被发出请求的客户端接收。浏览器渲染响应中包含的HTML和CSS代码,并执行JavaScript代码,最终把解析后的页面呈现在用户浏览器的窗口中。

flask项目的配置

注:windows防火墙高级配置里面可以新建规则开放端口(不过好像不设置这个也可以访问)
在这里插入图片描述
打开mongodb数据库连接:
在这里插入图片描述

mongod.exe --config mongod.cfg
在这里插入图片描述
注意,记录写在了log中,所以什么都不会输出

下面是flask目录:
在这里插入图片描述
与mongodb交互的代码:

from pymongo import MongoClient


class DataBaseManager(object):
    def __init__(self):
    
        client = MongoClient()
        database = client.chapter_4
        self.handler = database.people_info

    def query_info(self):
  
        info_list = list(self.handler.find({'deleted': 0}, {'_id': 0}))
        return info_list

    def _query_last_id(self):
    
        last_info = self.handler.find({}, {'_id': 0, 'id': 1}).sort('id', -1).limit(1)
        return last_info[0]['id'] if last_info else 0

    def add_info(self, para_dict):
   
        last_id = self._query_last_id()
        this_id = last_id + 1
        para_dict['id'] = this_id
        try:
            self.handler.insert_one(para_dict)
        except Exception as e:
            print('插入数据失败,保存信息如下:{}'.format(e))
            return False
        return True

    def update_info(self, people_id, para_dict):
     
        try:
            y = self.handler.update_one({'id': people_id}, {'$set': para_dict})
            print(y)
        except Exception as e:
            print('更新数据错误,报错信息如下:{}'.format(e))
            return False
        return True

    def del_info(self, people_id):
    
        return self.update_info(people_id, {'deleted': 1})


if __name__ == '__main__':
    database_manager = DataBaseManager()

main.py代码:

import json
from flask import Flask, render_template, request
from your_code_here.DataBaseManager import DataBaseManager
from util.Checker import Checker

app = Flask(__name__)
manager = DataBaseManager()
checker = Checker()


@app.route('/')
def index():
    data_list = manager.query_info()
    return render_template('index.html', data_list=data_list)


@app.route('/add', methods=['POST'])
def add_info():
    info = request.json
    if not checker.check_add_fields_exists(info):
        return json.dumps({'success': False, 'reason': '字段不完整'}, ensure_ascii=False)
    fail_reason = checker.check_value_valid(info)
    if fail_reason:
        return json.dumps({'success': False, 'reason': fail_reason}, ensure_ascii=False)
    info['deleted'] = 0
    insert_result = manager.add_info(info)
    return json.dumps({'success': insert_result})


@app.route('/update', methods=['POST'])
def update_info():
    info = request.json
    if not checker.check_update_fields_exists(info):
        return json.dumps({'success': False, 'reason': '字段不完整'}, ensure_ascii=False)
    people_id = checker.transfer_people_id(info['people_id'])
    if people_id == -1:
        return json.dumps({'success': False, 'reason': 'ID必需为数字'})
    dict_tobe_updated = info['updated_info']
   # fail_reason = checker.check_value_valid(dict_tobe_updated)
    #if fail_reason:
     #   return json.dumps({'success': False, 'reason': fail_reason}, ensure_ascii=False)
    update_result = manager.update_info(people_id, dict_tobe_updated)
    return json.dumps({'success': update_result})


@app.route('/delete/<people_id>', methods=['GET'])
def delete(people_id):
    people_id = checker.transfer_people_id(people_id)
    if people_id > 0:
        delete_result = manager.del_info(people_id)
        return json.dumps({'success': delete_result})
    return json.dumps({'success': False, 'reason': 'ID必需为数字'})

template下面是html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>大创开支记录</title>
    <link rel="stylesheet" href="{{url_for('static', filename='css/spectre.min.css')}}">
    <script src="{{url_for('static', filename='js/jquery-3.3.1.min.js')}}"></script>
</head>
<body>
<div class="container">
    <div class="columns">
        <div class="column col-8 col-mx-auto">
            <header class="navbar">
                <section class="centered">
                    <div class="navbar-brand mr-2"><h2>大创开支记录</h2></div>
                </section>
            </header>
        </div>
    </div>
    <div class="columns">
        <div class="col-10 col-mx-auto">
            <div class="card">
                <div class="card-body">
                    <div class="col-12">
                        <table class="table table-striped table-hover">
                            <thead>
                            <tr>
                                <th>序号</th>
                                <th>下单同学</th>
                                <th>物品</th>
                                <th>收货日期</th>
                                <th>订单价格</th>
                                <th>订单备注</th>
                                <th>操作</th>
                            </tr>
                            </thead>
                            <tbody>
                            {% for data in data_list %}
                            <tr>
                                <td class="id" rowindex="{{data['id']}}">{{data['id']}}</td>
                                <td class="name" rowindex="{{data['id']}}">{{data.name}}</td>
                                <td class="age" rowindex="{{data['id']}}">{{data.age}}</td>
                                <td class="birthday" rowindex="{{data['id']}}">{{data.birthday}}</td>
                                <td class="origin-home" rowindex="{{data['id']}}">{{data.origin_home}}</td>
                                <td class="current-home" rowindex="{{data['id']}}">{{data.current_home}}</td>
                                <td>
                                    <button class="btn btn-success" name="edit_this_info" rowindex="{{data['id']}}">编辑
                                    </button>
                                    <button class="btn btn-error" name="delete_this_info" rowindex="{{data['id']}}">删除
                                    </button>
                                </td>
                            </tr>
                            {% endfor %}
                            </tbody>
                        </table>
                    </div>
                    <div class="col-12" style="margin-top: 15px">
                        <button class="btn btn-success centered" id="open_add_modal">添加商品</button>
						 <button class="btn btn-success centered" id="cal_info" onclick="display()">计算总价</button>
                    </div>
                </div>
            </div>
            <div class="modal" id="modal_edit_info">
                <a href="#close" class="modal-overlay" aria-label="Close"></a>
                <div class="modal-container">
                    <div class="modal-header">
                        <div id="close_edit_modal" class="btn btn-clear float-right" aria-label="Close"></div>
                        <div class="modal-title h5">编辑信息</div>
                    </div>
                    <div class="form-horizontal">
                        <div class="modal-body">
                            <div class="content">
                           
                                    <div class="form-group">
                                        <div class="col-3 col-sm-12">
                                            <label class="form-label" for="edit-name">序号</label>
                                        </div>
                                        <div class="col-9 col-sm-12">
                                            <input class="form-input" type="text" id="edit-id">
                                        </div>
                                    </div>
                      
                                <div class="form-group">
                                    <div class="col-3 col-sm-12">
                                        <label class="form-label" for="edit-name">学生姓名</label>
                                    </div>
                                    <div class="col-9 col-sm-12">
                                        <input class="form-input" type="text" id="edit-name" placeholder="姓名">
                                    </div>
                                </div>
                   
                                    <div class="form-group">
                                        <div class="col-3 col-sm-12">
                                            <label class="form-label" for="edit-age">物品</label>
                                        </div>
                                        <div class="col-9 col-sm-12">
                                            <input class="form-input" type="text" id="edit-age" placeholder="物品">
                                        </div>
                                    </div>
                        
                                <div class="form-group">
                                    <div class="col-3 col-sm-12">
                                        <label class="form-label" for="edit-birthday">收货日期</label>
                                    </div>
                                    <div class="col-9 col-sm-12">
                                        <input class="form-input" type="text" id="edit-birthday" placeholder="收货日期">
                                    </div>
                                </div>
                                <div class="form-group">
                                    <div class="col-3 col-sm-12">
                                        <label class="form-label" for="edit-origin-home">订单价格</label>
                                    </div>
                                    <div class="col-9 col-sm-12">
                                        <input class="form-input" type="text" id="edit-origin-home" placeholder="订单价格">
                                    </div>
                                </div>
                                <div class="form-group">
                                    <div class="col-3 col-sm-12">
                                        <label class="form-label" for="edit-current-home">订单备注</label>
                                    </div>
                                    <div class="col-9 col-sm-12">
                                        <input class="form-input" type="text" id="edit-current-home"
                                               placeholder="订单备注">
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="modal-footer">
                            <button class="btn btn-success centered" id="update_info">更新</button>
                        </div>
                    </div>
                </div>
            </div>
            <div class="modal" id="modal_add_info">
                <a href="#close" class="modal-overlay" aria-label="Close"></a>
                <div class="modal-container">
                    <div class="modal-header">
                        <div id="close_add_modal" class="btn btn-clear float-right" aria-label="Close"></div>
                        <div class="modal-title h5">添加信息</div>
                    </div>
                    <div class="form-horizontal">
                        <div class="modal-body">
                            <div class="content">
                                <div class="form-group">
                                    <div class="col-3 col-sm-12">
                                        <label class="form-label" for="input-name">姓名</label>
                                    </div>
                                    <div class="col-9 col-sm-12">
                                        <input name="name" class="form-input" type="text" id="input-name"
                                               placeholder="姓名">
                                    </div>
                                </div>
                           
                                    <div class="form-group">
                                        <div class="col-3 col-sm-12">
                                            <label class="form-label" for="input-age">物品</label>
                                        </div>
										  <input name="birthday" class="form-input" type="text" id="input-age"
                                               placeholder="物品">
                                    <!--     <div class="col-9 col-sm-12">
                                            <input name="age" class="form-input" type="text" id="input-age"
                                                   placeholder="年龄:根据生日自动计算">
                                        </div> -->
                                    </div>
                       
                                <div class="form-group">
                                    <div class="col-3 col-sm-12">
                                        <label class="form-label" for="input-birthday">收货日期</label>
                                    </div>
                                    <div class="col-9 col-sm-12">
                                        <input name="birthday" class="form-input" type="text" id="input-birthday"
                                               placeholder="收货日期">
                                    </div>
                                </div>
                                <div class="form-group">
                                    <div class="col-3 col-sm-12">
                                        <label class="form-label" for="input-origin-home">订单价格</label>
                                    </div>
                                    <div class="col-9 col-sm-12">
                                        <input name="origin_home" class="form-input" type="text" id="input-origin-home"
                                               placeholder="订单价格">
                                    </div>
                                </div>
                                <div class="form-group">
                                    <div class="col-3 col-sm-12">
                                        <label class="form-label" for="input-current-home">备注</label>
                                    </div>
                                    <div class="col-9 col-sm-12">
                                        <input name="current_home" class="form-input" type="text"
                                               id="input-current-home"
                                               placeholder="备注">
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="modal-footer">
                            <button class="btn btn-success centered" id="add_info">添加商品</button>
                        </div>
						
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="{{url_for('static', filename='js/operation.js')}}">

</script>
</body>
</html>

进入该目录下输入:set FLASK_APP=main.py
flask run --host=0.0.0.0 --port=8000
在这里插入图片描述
然后手机浏览器输入ip即可访问:
在这里插入图片描述

点击添加按钮,可以发现成功添加了数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【flask学习笔记】flask与HTTP,flask与mongodb交互,用手机输入局域网ip访问flask界面 的相关文章

  • ROS中TF广播和监听个人理解及消息查找

    ROS学习古月居TF使用总结 目录 ROS学习古月居TF使用总结大佬链接总代码目录The Code of TFboardcastThe Code of TFlistenerThe Code of launch 广播和监听者的使用总结广播的创
  • Latex自动化学报模板学习和问题解决总结

    根据自动化学报模板的自己摸索 目录 根据自动化学报模板的自己摸索1 前言2 模板内部文件简介3 生成自己的模板4 内部代码理解关于aas cls和aas cfg文件整个模板固定结构 5 编译时有用的模板双栏显示用的小表格插入小图片 6 遇到
  • SLAM算法总结1

    目录 前言旋转矩阵 xff0c 旋转向量 xff0c 四元数李群李代数BCH公式非线性最小二乘一阶和二阶梯度法一阶梯度法二阶梯度法 xff08 牛顿法 xff09 高斯牛顿法代码实现手写 xff08 片段 xff09 用Ceres实现 xf
  • ROS下使用串口发送数据

    ROS下使用串口发送数据 span class token macro property span class token directive keyword include span span class token string lt
  • 新手如何使用postman(新手使用,简单明了)

    如何使用postman 一 了解postman 1 什么是postman xff1f 软件测试用来做接口测试的工具 2 如何下载postman https www getpostman com xff08 官方下载 xff09 链接 xff
  • 字符串的截取、分割,截取指定字符前面(后面)所有字符

    关于字符串截取问题 xff0c 从网上搜到总结一下 xff1a 已知一个字符串 xff0c 截取第一个指定字符后面所有字符 首先得知道indexof 34 34 的用法 xff0c 例如String i 61 abcdefg xff0c 那
  • [资料分享] 好赢60A无刷电调设置说明书【详细】

    完全针对车模而设计的全新程序算法 xff0c 具有优异的启动效果 加速性能 刹车性能及线性度 xff1b 支持所有无感 xff08 即无霍尔传感器 xff09 无刷电机 xff1b 高品质用料 xff0c 具有强大的耐电流能力 xff1b
  • 单片机学习笔记 —— 串口通信原理

    一 串口通信电路 电路图 xff1a 说明 xff1a 当RXD TXD为低电平时 xff0c 对应的led灯会亮起 二 串口通信控制寄存器 下图为80C51串行口的结构 xff1a SCON serial Control Register
  • 四种方法计算字符串的长度

    在这里我提供四种方法计算字符串的长度 1 使用递归函数 2 数数 xff0c 从第一个字符开始数数 xff0c 没遇到一个字符 xff0c 长度加一 xff0c 直到遇到 34 0 34 停止数数 3 使用strlen函数 xff0c 使用
  • 汉诺塔问题—C语言实现

    一 题目描述 相传在古印度圣庙中 xff0c 有一种被称为汉诺塔 Hanoi 的游戏 该游戏是在一块铜板装置上 xff0c 有三根杆 编号A B C xff0c 在A杆自下而上 由大到小按顺序放置64个金盘 如下图 游戏的目标 把A杆上的金
  • linux三大剑客

    awk是一种很棒的语言 xff0c 适合文本处理和报表生成 使用方法 awk pattern 43 action filenames 尽管操作可能会很复杂 xff0c 但是语法总是这样 xff0c 其中pattern表示AWK再数据中查找的
  • 数据结构与算法之栈

    目录 顺序栈 xff1a 链式栈 xff1a 栈的使用 xff1a 首先 xff1a 栈是一个特殊的线性表 xff0c 只允许在一端进行插入 xff08 压栈 xff09 和删除元素 xff08 进栈 xff09 xff0c 这一端称为栈顶
  • 二叉树的典型习题总结

    二叉树的三种遍历方式 xff1a 1 给定一个二叉树 xff0c 返回它的前序遍历 root left right 递归实现 xff1a public List lt Integer gt preorderTraversal TreeNod
  • javascript简介及基本语法

    这两天了解到一门新的脚本语言 javascript xff0c 貌似能干的事情好多呀哈哈哈哈 xff0c 言归正传啧 目录 javascript简介 js的简介 js的特点 javascript和java的区别 javascript的组成
  • Postman~做接口测试

    在工作中 xff0c 接口测试势必是最有效的测试途径 因此 xff0c 学习接口测试的基础和工具是很有必要的 xff0c 从Postman开始吧 xff5e 目录 1 接口测试简介 2 接口测试流程及用例设计 3 使用Postman执行接口
  • pytest接口测试自动化框架

    目录 pytest简介及安装 pytest的使用规则 pytest运行方式 主函数方式 命令行方式 跳过 标记及预期失败特殊场景处理 pytest前后置 夹具 pytest高级用法fixture pytest接口断言 pytest结合all
  • 测试的阶段性小小总结

    转眼入职2年之余 xff0c 毕业后就投入测试行业 在日常的工作中也有自己的一些思考和总结 2021到2023是多变的两年 xff0c 加入教培行业 xff0c 受双减政策影响 xff0c 注定艰难 参与了各种类型的测试项目 xff0c 不
  • 关于Charles抓包

    目录 抓包的原理 抓包的步骤 1 下载Charles 2 PC抓HTTPS协议的包 3 移动端抓包步骤 证书的原理 抓包的原理 抓包的软件非常多 xff0c 其实底层逻辑充当了一个中间人代理的角色来对HTTPS进行抓包 xff0c 结合日常
  • Ubuntu下使用CMakeLists.txt管理C/C++代码

    Ubuntu下使用CMakeLists txt管理C C 43 43 代码 一 CMakeLists txt入门知识1 CMakeLists txt的编译方法2 CMakeLists txt的文件内容3 编译的C文件 二 CMakeList
  • C语言中的__FILE__、__LINE__和__func__等预定义宏和注意事项

    C语言预处理要求定义某些对象宏 xff0c 运用这些预定义宏能使调试变得更简单 xff0c 每个预定义宏的名称一两个下划线字符开头和结尾 xff0c 这些预定义宏不能被取消定义 xff08 undef xff09 或由编程人员重新定义 常用

随机推荐