Flask 与小程序 微信模板消息

wx.requestSubscribeMessage 小程序模版消息升级为订阅消息, | 微信开放社区

wx.requestSubscribeMessage(Object object) | 微信开放文档

调起客户端小程序订阅消息界面,返回用户订阅消息的操作结果。当用户勾选了订阅面板中的“总是保持以上选择,不再询问”时,模板消息会被添加到用户的小程序设置页,通过 wx.getSetting 接口可获取用户对相关模板消息的订阅状态

common/libs/queue/QueueService.py

# -*- coding: utf-8 -*-
import json
from common.models.queue.QueueList import QueueList
from common.libs.Helper import getCurrentDate
from application import app,db
class QueueService():

    @staticmethod
    def addQueue( queue_name,data = None ):
        model_queue = QueueList()
        model_queue.queue_name = queue_name
        if data:
            model_queue.data = json.dumps( data )

        model_queue.created_time = model_queue.updated_time = getCurrentDate()
        db.session.add( model_queue )
        db.session.commit()
        return True


数据库common/models/queue/QueueList.py

DROP TABLE IF EXISTS `queue_list`;

CREATE TABLE `queue_list` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `queue_name` varchar(30) NOT NULL DEFAULT '' COMMENT '队列名字',
  `data` varchar(500) NOT NULL DEFAULT '' COMMENT '队列数据',
  `status` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '状态 -1 待处理 1 已处理',
  `updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',
  `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='事件队列表';
flask-sqlacodegen 'mysql://root:root@127.0.0.1/food_db' --tables queue_list --outfile "common/models/pay/QueueList.py"  --flask

jobs/launcher.py

# -*- coding: utf-8 -*-
from application import app,manager
from flask_script import Command,Option
import argparse,sys,traceback

'''
python manage.py runjob -m Test  (  jobs/tasks/Test.py )
python manage.py runjob -m test/Index (  jobs/tasks/test/Index.py )
* name or flags - 名称或选项字符串列表, e.g. foo or -f, --foo.
* action - 参数如果定义了选项,表示这是一个操作参数,至于调用时做哪种操作由用户输入或者default决定。
* nargs - 应该使用的命令行参数数。.
* const - 某些动作或参数个数的常数值。.
* default - 如果命令行没有对输入这个参数相应的值,则此参数用default给出的值.
* type -将用户输入的值转化为哪种类型.
* choices - 参数可输入值的范围或选择.
* required - 命令行输入的值是否可以被忽略(布尔量).
* help - 参数的简要描述.
* metavar - useage中显示的参数的名称.
* dest - 要添加到解析参数返回的对象中的属性的名称.
'''
class runJob( Command ):

    capture_all_args = True
    def run(self,*args,**kwargs):
        args = sys.argv[2:]
        parser = argparse.ArgumentParser( add_help = True )

        parser.add_argument("-m","--name",dest = "name",metavar = "name", help="指定job名",required=True)
        parser.add_argument("-a","--act",dest = "act",metavar = "act", help="Job动作",required=False)
        parser.add_argument("-p","--param",dest = "param",nargs = "*", metavar = "param",help="业务参数",default = '',required=False)
        params = parser.parse_args( args )

        # app.logger.info( sys.argv)

        params_dict = params.__dict__
        ret_params = {}
        for item in params_dict.keys():
            ret_params[ item ] = params_dict[ item ]

        if "name" not in ret_params or not ret_params['name']:
            return self.tips()

        module_name = ret_params['name'].replace( "/","." )
        try:
            import_string = "from jobs.tasks.%s import JobTask as  job_target" % ( module_name )
            exec( import_string , globals() )
            target = job_target()
            target.run( ret_params )
        except Exception as e:
            traceback.print_exc()


    def tips(self):
        tip_msg = '''
            请正确调度Job
            python manage runjob -m Test  (  jobs/tasks/Test.py )
            python manage runjob -m test/Index (  jobs/tasks/test/Index.py )
        '''
        app.logger.info( tip_msg )
        return False

runJob( Command ):

这段代码是一个类runJob的定义,继承自Command类。它有一个run方法,用于执行一些操作。具体的功能如下:

  1. 通过命令行参数获取nameactparam的值。
  2. 如果没有指定name或者name为空,则返回一个提示信息。
  3. name中的斜杠替换为点,到module_name
  4. 其他的代码逻辑没有提供,无法判断具体的作用。

app.logger.info()

是一个用于记录信息级别日志的方法。它可以用来记录一些重要的信息,但不会被标记为错误级别。下面是一个示例:

app.logger.info('message info is %s', message, exc_info=1)

这个示例中,'message info is %s’是日志消息的格式字符串,%s是一个占位符,用于将变量message的值插入到字符串中。exc_info=1参数用于在日志中包含异常信息。

 app.logger.info( sys.argv)

app.logger.info(params)

app.logger.info(params_dict)

app.logger.info (import_string)

(imooc)[root@localhost order]# python manager.py runjob -m test/Index -a ttt -p dddd
[2018-08-12 11:29:22,917] INFO in launcher:['manager.py', 'runjob', '-m', 'test/Index', '-a', 'ttt', '-p', 'dddd']
[2018-08-12 11:29:22,918] INFO in launcher:Namespace(act='ttt', name='test/Index', param=['dddd'])
[2018-08-12 11:29:22,918] INFO in launcher:{'name':'test/Index', 'act':'ttt', 'param':['dddd']}i am test
[2018-08-12 11:30:42,946] INFO in launcher: from jobs.tasks.test.Index import JobTask as job_target i am test

flask_script中的commands.py   请简单介绍一下python中的command 类

Flask-Script是一个Flask扩展,用于管理和运行命令行脚本。它提供了一个Command类,用于定义自定义命令。通过继承Command类并实现其中的run方法,可以创建自己的命令。

下面是一个简单的示例,展示了如何使用Flask-Script的Command类创建一个自定义命令:

from flask_script import Command

class MyCommand(Command):
    def run(self):
        print("This is my custom command.")

在上面的示例中,我们创建了一个名为MyCommand的自定义命令,它继承自Flask-Script的Command类。在run方法中,我们定义了命令要执行的操作,这里只是简单地打印一条消息。

要在Flask应用中使用这个自定义命令,需要将其添加到Manager对象中,然后通过命令行运行。下面是一个完整的示例:

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)

@manager.command
def mycommand():
    print("This is my custom command.")

if __name__ == '__main__':
    manager.run()

在上面的示例中,我们创建了一个Flask应用,并创建了一个Manager对象。通过装饰器@manager.command,我们将mycommand函数注册为一个命令。当我们在命令行中运行python app.py mycommand时,就会执行mycommand函数中定义的操作。

import_string = "from jobs.tasks.%s import JobTask as job_target" % ( module_name )
exec( import_string , globals() )

这段代码是使用Python中的exec函数动态导入模块并执行其中的代码。具体来说,它根据给定的module_name字符串动态生成一个import语句,并将其作为字符串传递给exec函数进行执行。这样可以根据不同的module_name值导入不同的模块,并执行其中的代码。

下面是一个示例:

module_name = "example_module"
import_string = "from jobs.tasks.%s import JobTask as job_target" % (module_name)
exec(import_string, globals())

在这个示例中,假设jobs.tasks模块下有一个名为example_module的模块,并且该模块中定义了一个名为JobTask的类。通过将module_name设置为"example_module",我们可以动态导入该模块,并将其中的JobTask类赋值给job_target变量。

请注意,使用exec函数动态导入模块和执行代码是一种强大但潜在危险的操作。在实际使用中,应该谨慎考虑安全性和可维护性,并确保只导入可信的模块。

flask-script 第三方库为什么不更新了?

flask-script 第三方库不再更新的原因可能是因为它的功能已经被集成到 Flask 框架中,或者有其他更好的替代方案出现。Flask 官方文档中也建议使用 Flask 的命令行接口(Flask CLI)来替代 flask-script。Flask CLI 提供了更简洁、更强大的命令行操作项目的方式。

如果你仍然想使用 flask-script,你可以继续使用它,但需要注意它可能不再得到官方的更新和支持。另外,你也可以考虑迁移到其他类似的第三方库,如 Click 或 Fire,它们提供了更多的功能和更好的兼容性。

mina/pages/my/order_list.js

<view class="container">
    <view class="status-box">
        <view bindtap="statusTap" class="status-label {{index == currentType ? 'active' : ''}}" wx:for-items="{{statusType}}" wx:key="{{index}}" data-index="{{index}}">
            {{item}}
            <view class="{{tabClass[index]}}"></view>
        </view>
    </view>
    <view class="no-order" wx:if="{{!order_list.length}}">
        <image src="/images/no-order.png" class="no-order-img"></image>
        <view class="text">暂无订单</view>
    </view>
    <view class="order-list" wx:if="{{order_list.length}}">
        <view class="a-order" wx:for="{{order_list}}" wx:key="{{index}}" wx:for-item="item">
            <view class="order-date" data-id="{{item.order_sn}}" bindtap="orderDetail">
                <view class="date-box">下单时间:{{item.date}}</view>
                <view class="status {{(item.status==0 || item.status==1) ? '':'red'}}">{{item.status_desc}}</view>
            </view>
            <view class="goods-info"  data-id="{{item.order_sn}}" bindtap="orderDetail">
                <view class="goods-des">
                   <view>订单号:{{item.order_number}} </view>
                   <view wx:if="{{item.note && item.note != ''}}">备注: {{item.note}}</view>
                </view>
            </view>
            <view >
                <scroll-view class="goods-img-container" scroll-x="true">
                    <view class="img-box" wx:for="{{item.goods_list}}" wx:for-item="itemGood">
                        <image src="{{itemGood.pic_url}}" class="goods-img"></image>
                    </view>
                </scroll-view>
            </view>
            <view class="price-box">
                <view class="total-price">合计:¥ {{item.total_price}}</view>
                <view class="btn cancel-btn" bindtap="orderCancel" data-id="{{item.order_sn}}" wx:if="{{item.status==-8}}">取消订单</view>
                <view class="btn topay-btn" bindtap="toPay" data-id="{{item.order_sn}}" wx:if="{{item.status==-8}}">马上付款</view>

                <view class="btn topay-btn" bindtap="orderConfirm" data-id="{{item.order_sn}}" wx:if="{{item.status==-6}}">确认收货</view>
                <view class="btn topay-btn" bindtap="orderComment" data-id="{{item.order_sn}}" wx:if="{{item.status==-5}}">走,去评价</view>
            </view>
        </view>
    </view>
</view>

price-box

data-id

data-id是一种HTML属性,用于标识元素的唯一性。它可以用于JavaScript和CSS中,以便对元素进行操作或样式设置。data-id的值可以是任何字符串,通常用于存储与元素相关的数据或标识符。通过使用data-id属性,可以方便地在前端代码中引用和操作特定的元素。例如,可以使用data-id来选择特定的元素并对其进行样式修改或事件绑定。

  1. 这段代码是一个小程序的视图部分,主要展示了一个订单的价格信息和相关操作按钮。具体解释如下:

  2. <view class="price-box">:这是一个视图容器,用于包裹订单价格和操作按钮。

  3. <view class="total-price">合计:¥ {{item.total_price}}</view>:这是一个展示订单总价的文本视图,使用了小程序的数据绑定语法{{item.total_price}}来显示订单的总价。

  4. <view class="btn cancel-btn" bindtap="orderCancel" data-id="{{item.order_sn}}" wx:if="{{item.status==-8}}">取消订单</view>:这是一个取消订单的按钮,当订单状态为-8时才会显示。点击按钮会触发名为orderCancel的事件,并传递订单编号item.order_sn作为参数。

  5. <view class="btn topay-btn" bindtap="toPay" data-id="{{item.order_sn}}" wx:if="{{item.status==-8}}">马上付款</view>:这是一个立即付款的按钮,当订单状态为-8时才会显示。点击按钮会触发名为toPay的事件,并传递订单编号item.order_sn作为参数。

  6. <view class="btn topay-btn" bindtap="orderConfirm" data-id="{{item.order_sn}}" wx:if="{{item.status==-6}}">确认收货</view>:这是一个确认收货的按钮,当订单状态为-6时才会显示。点击按钮会触发名为orderConfirm的事件,并传递订单编号item.order_sn作为参数。

  7. <view class="btn topay-btn" bindtap="orderComment" data-id="{{item.order_sn}}" wx:if="{{item.status==-5}}">走,去评价</view>:这是一个去评价的按钮,当订单状态为-5时才会显示。点击按钮会触发名为orderComment的事件,并传递订单编号item.order_sn作为参数。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinzheng新政

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值