阿里云发送短信 python3实现

import uuid import datetime import hmac import base64 import requests from urllib.parse import urlencode, quote class AliyunSMS(object): def __init__(self, app): self.app = app self.format = app.config.get("ALIYUN_API_FORMAT") or "JSON" self.version = "2016-09-27" self.key = app.config["ALIYUN_API_KEY"] self.secret = app.config["ALIYUN_API_SECRET"] self.signature = "" self.signature_method = "HMAC-SHA1" self.signature_version = "1.0" self.signature_nonce = str(uuid.uuid4()) self.timestamp = datetime.datetime.utcnow().isoformat("T") self.region_id = app.config["ALIYUN_API_REGION_ID"] self.gateway = app.config["ALISMS_GATEWAY"] self.action = "" self.sign = "" self.template = "" self.params = {}…

jabberd2认证配置之mysql配置

jabberd2自带了的authreg支持mysql、sqlite、ldap、pipe等方式。通常情况下,你有一个网站为用户提供服务,用户在你的网站注册了,用户名和密码信息存储在网站服务器的数据库中。而现在你用jabberd2为用户搭建了一个xmpp聊天服务器,并且希望你的用户能够通过在你的网站上注册的用户名和密码登录聊天服务器,而不是在聊天服务器上创建新用户,那么你可以使用jabberd2自带的authreg_mysql模块。要使用authreg_mysql模块,你需要在c2s.xml的mysql节修改或添加如下配置: <mysql> <!-- 数据库服务器的地址和端口 --> <host>localhost</host> <port>3306</port> <!-- 数据库名 --> <dbname>jabberd2</dbname> <!-- 数据库用户和密码 --> <user>jabber</user> <pass>jabber</pass> <!-- table_name为数据库中存储用户表的表名 --> <table>table_name</table> <field> <!-- username_field为表中用户名字段 --> <username>username_field</username> <!-- password_field为表中密码字段 --> <username>password_field</username> <!-- realm_filed,c2s.xml中配置的realm --> <username>realm_filed</username> </field> </mysql> 如果你的用户表中,没有关于real的字段,所有的用户属于同一区域下,你可以使用下面这种配置: <mysql> <!-- 数据库服务器的地址和端口 --> <host>localhost</host> <port>3306</port> <!-- 数据库名 --> <dbname>jabberd2</dbname> <!-- 数据库用户和密码 --> <user>jabber</user> <pass>jabber</pass> <sql> <!-- 替换_password,_usertable,_username,_realm为真实的名称,_realm与c2s.xml中配置的相同 --> <select>select `_password` from `_usertable` where `_username` = '%s' and '%s' = '_realm'</select> </sql> </mysql> 更多信息请参考https://github.com/jabberd2/jabberd2/blob/master/storage/authreg_mysql.c。…

《C++注解》第9章 类和内存分配

第9章 类和内存分配 和C语言中的内存分配函数(如malloc)对比,C++中的内存分配是由new运算符完成的。malloc和new的主要区别如下: malloc自身不清楚被分配的内存将作何用。例如,当为int类型分配内存时,编程者必须提供一个正确的表达式,用于表示分配多少个sizeof(int)大小的空间。相比之下,new只需指定一个类型就可,编译器会隐式调用sizeof运算符。使用new是类型安全的。 ~~malloc分配的内存会被calloc舒适化为指定的值~~(译者注:malloc不会调用calloc初始化,malloc分配的内存是未被初始化的,calloc分配的内存会被自动初始化为0)。如果分配的内存是为一个对象使用,这是不必要的。因为new运算符会根据该对象的构造函数对该内存进行特定的初始化。 采用C中的内存分配函数,我们必须要检查这些函数的返回值是否为NULL,采用new分配内存时则不需要这样的检查,我们可以通过配置new_handler来指定new失败时要执行的动作。 free和delete的比较:delete运算符能够保证在回收某个对象的内存时,这个对象的析构函数会被调用。 本章重点要讲的就是创建对象和销毁对象时,构造函数和析构函数的自动执行。在C程序的开发中,许多问题都是由不正常的内存分配和内存泄露造成的,如内存未被分配,内存未被释放,内存未被初始化,内存访问越界等。虽然C++不能自动的解决这些问题,但它给我们提供了有用的工具来防止这类问题的发生。 在C中,malloc经常用来处理字符串。在string.h其中有一些字符串处理函数是基于malloc的,如strdup。这些函数在C++中,我们应避免使用这些函数,取而代之,我们应该使用string类以及new和delete运算符。 Memory allocation procedures influence the way classes dynamically allocating their own memory should be designed. 因此,除了new和delete运算符,本章还会讨论这些内容。首先,先介绍new和delete运算符,然后会讨论: 析构函数:在对象被销毁时被调用的成员函数。 赋值运算符:允许我们将一个对象赋值给同类的另一个对象。 this指针:在一个对象的成员函数被调用时,明确的引用这个对象。 拷贝构造:创建一个对象副本的构造函数。 移动构造:从一个匿名的临时变量穿件对象的构造函数。 9.1 new和delete运算符 C++定义了两个用来分配和释放内存的运算符,分别为new和delete。 下面是一个简单的示例程序来演示如何使用他们。一个int类型的指针指向new申请的内存,之后该内存通过delete进行释放。 int *ip = new int; delete ip; 下面是new和delete运算符的一些特性: new和delete是运算符,因此使用时不需要加括号 new返回指向一个内存区域,该指针的类型为被分配内存的对象类型(上例中,返回一个int类型的指针) new后面跟着一个类型名称作为操作数,因此能为该类新的对象分配正确数量的内存 new是一个类型安全的操作符,它总是能够返回一个指向和操作数相同类型对象的指针,并且该指针的类型和这个对象的类型相同 new可能会失败,但是开发者不必担心这个问题,程序中不需要像使用malloc时那样必须检测内存是否分配成功,在9.2.2中会深入讨论new的这个特性 delete返回void new和delete必须成对使用,一个由new申请的内存,最终要有一个相对应的delete执行,以免内存泄露的情况发生 delete能够安全的处理0指针(什么也不做) delete只能释放由new申请的内存,不应该用来释放使用malloc申请的内存 C++中,malloc和相近的内存分配函数(如calloc)是被弃用的,因此我们应避免使用它们 new运算符既可以为基本类型分配内存,又可以给对象分配内存。当为基本类型或者没有构造函数的struct类型分配内存时,不能保证这些内存被初始化为0,但是我们可以为其提供一个初始化表达式。 int *v1 = new int; // not guaranteed to be initialized to 0 int *v1 = new…