整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Python用20行代码就能实现漂亮的网页界面?你确定不来看看

们在写一个网站或者一个网页界面的时候,需要学习很多东西,对小白来说很困难!比如我要做一个简单的网页交互:

要懂后端,比如Python里面的Django或者Flask,或者是Java里面的SpringBoot

要懂前端,现在都叫大前端了(因为很复杂),比如前端的框架Vue/React, 然后页面的美化框架Bootstrap ,还有html ,csss 和Javascript 三驾马车.

天啊,听听头都大呢!其实我就给老板做一个简单的交互的页面,而且我只会Python ,有没有很简单的办法可以做到呢。

今天小编在Github上逛的时候,找到一个非常酷的神器,名字叫remi ,目前收获了2300个赞。

star并不是很多, 但是这个库可是选入2018年的十大明星库 ,号称是一个独立的GUI库,而且最牛逼的就是这个库 竟然小于 100K ,是否很神奇呢,我们一起来体验一下特性:

跟其他GUI库区别? Kivy,PyQT和PyGObject都需要主机操作系统的本机代码,这意味着安装或编译大型依赖项。Remi只需要一个Web浏览器即可显示您的GUI。

我需要懂HTML吗? 不,只需要使用Python进行编码。

它是开源的吗? 当然!Remi是根据Apache许可发布的。开源,免费!

我需要某种网络服务器吗? 不,自带网络服务器。

1、安装

如何安装呢,因为是Python 库,直接用pip 即可

pip install remi

如果是没有网络的,或者服务器跟外网不通的,可以离线安装。下载这个包,然后用install 安装

python setup.py install

2、快速体验

我们来快速看一下,这个简单的Hello world网页。

这里面包含了一个 2个元素:

  • 文本Hello world ;
  • 一个Press me的按钮;

点击这个按钮还会改变Hello world的文本内容,看点一下就变成了Button pressed.

上面这个简单的效果,其实只用了20来行Python代码,都是原生的Python代码,没有用一行HTML .

我们来看一下源码:

整个代码的结构层次还很清晰的:

  • 首先声明一个MyApp类,这个类会继承母框架App里面的功能,可以认为是一个网页画布;
  • 然后在这个画布里面有3个函数:

init主要是做类的初始化工作;

main主要对这个画布布局进行设计,包含一个文本和一个按钮。

on_button_pressed主要是控件的相应,点击触发函数

  • 最后是start来启动这个类,就会生成一个本地的网站链接

3、更多复杂的网页元素

看完上面的设计是不是就觉得跟Python里面大名鼎鼎的tk库很相似啊,上面的只是开胃菜,这个remi还能提供更复杂的gui界面元素。

上面的是一个完整的demo页面,基本上常见的控件元素的都包含了,比如有菜单栏,文本,按钮,单选框,进度栏,下拉框,表格,弹出框,按钮选取文件路径,文件树形结构,日期等几十种控件。

有了这个神器,是不是可以告别Python里面的tk库,也可以省去学习HTML的时间,还等啥,赶紧下载尝鲜一下吧。

对Python感兴趣或者是正在学习的小伙伴,可以点赞关注收藏支持一波哦, 持续更新中


原文链接:https://blog.csdn.net/NNNJ9355/article/details/107319582

问题

我们需要以客户端的形式通过HTTP协议访问多种服务。比如,下载数据或者同一个基于REST的API进行交互。

解决方案

对于简单的任务来说,使用urllib.request模块通常就足够了。比方说,要发送一个简单的HTTP GET请求到远端服务器上,可以这样做:

from urllib import request, parse
# Base URL being accessed
url = 'http://httpbin.org/get'
# Dictionary of query parameters (if any)
parms = {
 'name1' : 'value1',
 'name2' : 'value2'
}
# Encode the query string
querystring = parse.urlencode(parms)
# Make a GET request and read the response
u = request.urlopen(url+'?' + querystring)
resp = u.read()

如果需要使用POST方法在请求主体(request body)中发送查询参数,可以将参数编码后作为可选参数提供给urlopen()函数,就像这样:

from urllib import request, parse
# Base URL being accessed
url = 'http://httpbin.org/post'
# Dictionary of query parameters (if any)
parms = {
 'name1' : 'value1',
 'name2' : 'value2'
}
# Encode the query string
querystring = parse.urlencode(parms)
# Make a POST request and read the response
u = request.urlopen(url, querystring.encode('ascii'))
resp = u.read()

如果需要在发出的请求中提供一些自定义的HTTP头,比如修改user-agent字段,那么可以创建一个包含字段值的字典,并创建一个Request实例然后将其传给urlopen()。示例如下:

from urllib import request, parse
...
# Extra headers
headers = {
 'User-agent' : 'none/ofyourbusiness',
 'Spam' : 'Eggs'
}
req = request.Request(url, querystring.encode('ascii'), headers=headers)
# Make a request and read the response
u = request.urlopen(req)
resp = u.read()

如果需要交互的服务比上面的例子都要复杂,也许应该去看看requests库([http://pypi. python.org/pypi/requests](http://pypi. python.org/pypi/requests))。比如,下面这个示例采用requests库重新实现了上面的操作:

import requests
# Base URL being accessed
url = 'http://httpbin.org/post'
# Dictionary of query parameters (if any)
parms = {
 'name1' : 'value1',
 'name2' : 'value2'
}
# Extra headers
headers = {
 'User-agent' : 'none/ofyourbusiness',
 'Spam' : 'Eggs'
}
resp = requests.post(url, data=parms, headers=headers)
# Decoded text returned by the request
text = resp.text

关于requests库,一个值得一提的特性就是它能以多种方式从请求中返回响应结果的内容。从上面的代码来看,resp.text带给我们的是以Unicode解码的响应文本。但是,如果去访问resp.content,就会得到原始的二进制数据。另一方面,如果访问resp.json,那么就会得到JSON格式的响应内容。

下面这个示例利用requests库来发起一个HEAD请求,并从响应中提取出一些HTTP头数据的字段:

import requests
resp = requests.head('http://www.python.org/index.html')
status = resp.status_code
last_modified = resp.headers['last-modified']
content_type = resp.headers['content-type']
content_length = resp.headers['content-length']

下面的示例使用requests库通过基本的认证在Python Package Index(也就是pypi)上执行了一个登录操作:

import requests
resp = requests.get('http://pypi.python.org/pypi?:action=login',
 auth=('user','password'))

下面的示例使用requests库将第一个请求中得到的HTTP cookies传递给下一个请求:

import requests
# First request
resp1 = requests.get(url)
...
# Second requests with cookies received on first requests
resp2 = requests.get(url, cookies=resp1.cookies)

最后但也同样重要的是,下面的例子使用requests库来实现内容的上传:

import requests
url = 'http://httpbin.org/post'
files = { 'file': ('data.csv', open('data.csv', 'rb')) }
r = requests.post(url, files=files)

讨论

对于确实很简单的HTTP客户端代码,通常使用内建的urllib模块就足够了。但是,如果要做的不仅仅只是简单的GET或POST请求,那就真的不能再依赖它的功能了。这时候就是第三方模块比如requests大显身手的时候了。

举个例子,如果我们决定坚持使用标准的程序库而不考虑像requests这样的第三方库,那么也许就不得不使用底层的http.client模块来实现自己的代码。比方说,下面的代码展示了如何执行一个HEAD请求:

from http.client import HTTPConnection
from urllib import parse
c = HTTPConnection('www.python.org', 80)
c.request('HEAD', '/index.html')
resp = c.getresponse()
print('Status', resp.status)
for name, value in resp.getheaders():
 print(name, value)

同样地,如果必须编写涉及代理、认证、cookies以及其他一些细节方面的代码,那么使用urllib就显得特别别扭和啰嗦。比方说,下面这个示例实现在Python package index上的认证:

import urllib.request
auth = urllib.request.HTTPBasicAuthHandler()
auth.add_password('pypi','http://pypi.python.org','username','password')
opener = urllib.request.build_opener(auth)
r = urllib.request.Request('http://pypi.python.org/pypi?:action=login')
u = opener.open(r)
resp = u.read()
# From here. You can access more pages using opener
...

坦白说,所有这些操作在requests库中都变得简单得多。

在开发过程中测试HTTP客户端代码常常是很令人沮丧的,因为所有棘手的细节问题都需要考虑(例如cookies、认证、HTTP头、编码方式等)。要完成这些任务,考虑使用httpbin服务(http://httpbin.org)。这个站点会接收发出的请求,然后以JSON的形式将响应信息回传回来。下面是一个交互式的例子:

>>> import requests
>>> r = requests.get('http://httpbin.org/get?name=Dave&n=37',
... headers = { 'User-agent': 'goaway/1.0' })
>>> resp = r.json
>>> resp['headers']
{'User-Agent': 'goaway/1.0', 'Content-Length': '', 'Content-Type': '',
'Accept-Encoding': 'gzip, deflate, compress', 'Connection':
'keep-alive', 'Host': 'httpbin.org', 'Accept': '*/*'}
>>> resp['args']
{'name': 'Dave', 'n': '37'}
>>>

在要同一个真正的站点进行交互前,先在httpbin.org这样的网站上做实验常常是可取的办法。尤其是当我们面对3次登录失败就会关闭账户这样的风险时尤为有用(不要尝试自己编写HTTP认证客户端来登录你的银行账户)。

尽管本节没有涉及,requests库还对许多高级的HTTP客户端协议提供了支持,比如OAuth。requests模块的文档(http://docs.python-requests.org)质量很高(坦白说比在这短短一节的篇幅中所提供的任何信息都好),可以参考文档以获得更多的信息。


果你不了解python,可以先了解python的简单用法。不过人邮君相信,在座的各位都是大佬,我们直接介绍操作。

第一部分,我们先来介绍python与mysql如何完成数据交互:

python 与 mysql 实现交互的过程,通常分为:建立连接、把sql语句定义为字符串,提交指令、关闭连接

核心的技能在于 sql语句;除了定义sql语句,其余3个处理都是固定的写法。接下来,人邮君结合《MySQL是怎样运行的》这本书,Linux环境为主,为大家进行说明。

MySQL是怎样运行的 从根儿上理解MySQL

MySQL是怎样运行的 从根儿上理解MySQL
¥49.5
购买
<script src="//mp.toutiao.com/mp/agw/mass_profit/pc_product_promotions_js?item_id=6909291449641075203"></script>

首先来看第一步,安装 MySQL 数据库:

如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单;

第二步,pymysql 模块安装与使用:

MySQL-python驱动,是python 操作mysql必不可少的模块。

下载MySQL-python-1.2.5.zip 文件之后直接解压。进入MySQL-python-1.2.5目录:

>>python setup.py install

下载地址:https://pypi.python.org/pypi/MySQL-python/

第三步,python与mysql的交互实现:

1)连接

pymysql .connect () 函数:连接数据库

使用 pymysql 的 connect() 方法连接数据库,涉及到几个参数,具体代表意义如下:

host:MySQL服务的地址,若数据库在本地上,使用 localhost 或者127.0.0.1。如果在其它服务器上,则写对应的 IP地址

port:服务的端口号,默认为3306,不写则为默认值。

user:登录数据库的用户名

passwd:登录 MySQL 的密码

db:数据库名

charset:设置为 utf8 编码,解决存汉字乱码问题

eg:

# 导入模块
import pymysql
# 打开数据库连接
conn = pymysql.connect(
    host="127.0.0.1",
    user="root",
    password="123456",
    database="test_db",
    charset="utf8")
print(conn)
print(type(conn))

输出结果显示如下:表面数据库连接成功

详细可以参考

https://www.cnblogs.com/qjj19931230/p/12550384.html?utm_source=tuicool

这里要强调的是,除了上面的连接方式,还有其他的连接。在《MySQL是怎样运行的》这本书中,介绍到,mysql连接分为内连接和外连接。内外连接的根本区别是在驱动表中记录不符合ON子句中的连接条件时,内连接不会把该记录加入到最后的结果集中,而外连接会。外连接分为左(外)连接和右(外)连接。


三种链接方式如下图所示:

2)获取游标

conn.cursor():获取游标

对数据库进行操作,只连接数据库是不够的,还需要获取操作数据库的游标,才能进行后续的操作。游标的主要作用是用来接收数据库操作后的返回结果,比如数据查询、插入和删除等。通过获取到的数据库连接实例 conn 下的 cursor() 方法来创建游标,如下:

# 导入模块
import pymysql
# 打开数据库连接
conn = pymysql.connect(
    host="127.0.0.1",
    user="root",
    password="123456",
    database="test_db",
    charset="utf8")
# print(conn)
# print(type(conn))
# 获取连接下的游标
cursor_test = conn.cursor()
print(cursor_test)

3)数据库操作

  • 创建表
import pymysql
# 打开数据库连接
conn = pymysql.connect(
    host="127.0.0.1",
    user="root",
    password="123456",
    database="test_db",
    charset="utf8")
# 获取连接下的游标
cursor_test = conn.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor_test.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 使用预处理语句创建表
sql = """CREATE TABLE user1 (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""
cursor_test.execute(sql)
# 关闭数据库连接
conn.close()

如下所示数据库表创建成功:

mysql> desc user1;
+------------+----------+------+-----+---------+-------+
| Field      | Type     | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+-------+
| FIRST_NAME | char(20) | NO   |     | NULL    |       |
| LAST_NAME  | char(20) | YES  |     | NULL    |       |
| AGE        | int(11)  | YES  |     | NULL    |       |
| SEX        | char(1)  | YES  |     | NULL    |       |
| INCOME     | float    | YES  |     | NULL    |       |
+------------+----------+------+-----+---------+-------+
5 rows in set (0.00 sec)
  • 插入数据
import pymysql
# 打开数据库连接
conn = pymysql.connect(
    host="127.0.0.1",
    user="root",
    password="123456",
    database="test_db",
    charset="utf8")
# 获取连接下的游标
cursor_test = conn.cursor()
# 使用预处理语句创建表
sql = """INSERT INTO user1(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Fei', 'Fei', 20, 'M', 1000)"""
try:
   # 执行sql语句
   cursor_test.execute(sql)
   # 提交到数据库执行
   conn.commit()
except:
   # 如果发生错误则回滚
   conn.rollback()
# 关闭数据库连接
conn.close()
  • 查询数据
import pymysql
# 打开数据库连接
conn = pymysql.connect(
    host="127.0.0.1",
    user="root",
    password="123456",
    database="test_db",
    charset="utf8")
# 获取连接下的游标
cursor_test = conn.cursor()
sql = """
    select * from user1"""
try:
    # 执行 sql 语句
    cursor_test.execute(sql)
    # 显示出所有数据
    data_result = cursor_test.fetchall()
    for row in data_result:
        fname = row[0]
        lname = row[1]
        age = row[2]
        sex = row[3]
        income = row[4]
        # 打印结果
        print("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
              (fname, lname, age, sex, income))
except:
    print("Error: unable to fetch data")
# 关闭数据库连接
conn.close()
  • 删除操作
# 导入模块
import pymysql
# 打开数据库连接
conn = pymysql.connect(
    host="127.0.0.1",
    user="root",
    password="123456",
    database="test_db",
    charset="utf8")
# print(conn)
# print(type(conn))
# 获取连接下的游标
cursor_test = conn.cursor()
sql = "DELETE * FROM user1"
try:
    # 执行SQL语句
    cursor_test.execute(sql)
    # 提交到数据库执行
    conn.commit()
except:
    # 发生错误时回滚
    conn.rollback()
# 关闭数据库连接
conn.close()

第二部分,我们来介绍如何实现「大量」数据的交互?

《MySQL是怎样运行的》,作者小孩子4919强调,嵌套循环连接算法是指驱动表只访问一次,但被驱动表却可能会访问多次,访问次数取决于驱动表执行单表查询后的结果集中有多少条记录,大致过程如下:


步骤1,选取驱动表,使用与驱动表相关的过滤条件,选取代价最低的单表访问方法来执行对驱动表的单表查询;

步骤2,对步骤1中查询驱动表得到的结果集中的每一条记录,都分别到被驱动表中查找匹配的记录。

由于被驱动表可能会访问多次,因此可以为被驱动表建立合适的索引以加快查询速度。

所以,如果被驱动表非常大,即需要完成大量的数据交换,多次访问被驱动表可能导致很多次的磁盘I/O读取操作,此时可以使用基于块的嵌套循环连接算法来缓解由此造成的性能损耗。Mysql的设计者,提出了名为Join Buffer(连接缓冲区)的概念:

有兴趣的同学,建议根据书中详细描述走一遍。

此外,人邮君特别建议大家看看《MySQL是怎样运行的》,它解决了“为什么这个SQL语句执行得这么慢?为什么我明明建立了索引,但是查询计划显示没用?为什么IN查询中的参数一多就不使用索引了?为什么我的数据显示成了乱码?”等等每一位DBA和后端开发人员在与MySQL打交道时,所遇到的很多常见问题。除此之外,索引结构、MVCC、隔离级别的实现、锁的使用等知识,也是求职人员在MySQL面试中躲不过去的高频问题,作者都在书中给出了很详细的介绍。

MySQL是怎样运行的 从根儿上理解MySQL


这本书的初稿最初是以小册的形式发布在掘金平台上的,一经发布便得到大家的青睐,十分火爆!历经两年,现在终于成书,有兴趣的小伙伴也可以去掘金围观~(小孩子4919 的个人主页)

从底层到应用,从基础到进阶,关于MySQL的一切,作者都在书中讲解得非常清楚,帮助你从根儿上理解MySQL。