0%

[TOC]

套接字

Socket:对于网络通信而言,套接字是一个通用的网络编程接口,用于不同主机的进程之间来通信,每一个socket都可用网络地址结构(协议、本地地址、本地端口)来表示。

分类:

  • 流式套接字(SOCK_STREAM):提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。TCP通信使用的就是流式套接字。
  • 数据报套接字(SOCK_DGRAM):提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。UDP通信使用的就是数据报套接字。
  • 原始套接字(SOCK_RAW):原始套接字允许对较低层次协议如IP、ICMP进行直接访问。它功能强大但使用较为不便,主要用于一些协议的开发。

python Socket包

参考

这里着重介绍今天要用到的:

  • socket.AF_INET:服务器之间网络通信
  • socket.SOCK_STREAM:流式socket , for TCP

由此,创建一个TCP Socket: s=socket.socket(family = socket.AF_INET,type = socket.SOCK_STREAM)

客户端socket函数:

s.connect(address):连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

让对象支持上下文管理器

为了让对象支持上下文管理器,需要实现

1
__enter__() 和 __exit__()两个方法

代码:

这里注意观察注释掉的代码和新的代码的不同。注释掉的代码一次只允许创建一个socket连接,而新的代码允许同时存在多个socket连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#author:GuiYoung
#desc:class to create web connection
#data 2021/9/7
#lazy_connection.py

from socket import socket, AF_INET, SOCK_STREAM

class LazyConnection:
def __init__(self, address, family=AF_INET, type=SOCK_STREAM):
self.address = address
self.family = AF_INET
self.type = SOCK_STREAM
#self.sock = None
self.connections = []

def __enter__(self):
# if self.sock is not None:
# raise RuntimeError('Already connected')
# self.sock = socket(self.family, self.type)
# self.sock.connect(self.address)
# return self.sock
sock = socket(self.family, self.type)
sock.connect(self.address)
self.connections.append(sock)
return sock

def __exit__(self, exc_type, exc_val, exc_tb):
# self.sock.close()
# self.sock = None
self.connections.pop().close()
1
2
3
4
5
6
7
8
#main.py
import lazy_connection

connection = lazy_connection.LazyConnection('https://www.baidu.com/',80)
with connection as conn1:
...
with connection as conn2:
...

[TOC]

当用户提交表单后,在flask中可以使用request获取用户提交的表单。

接下来详解几个函数。

reuqest.method

1
request.method #返回前端提交的方式,比如GET,POST等

reuqest.form

1
2
3
4
5
request.form #返回form表单中传来的值,类型:ImmutableMultiDict

#可以使用字典的方法来操作
#这里补充一下python字典的操作
dict.get(key, value)#可以返回第二个参数作为默认值

reuqest.args

1
2
3
4
5
6
7
8
9
reuqest.args #其中保存的是URL中的参数

#例如:localhost:5000/req?name=Lily&age=18
对于:
from flask import request
@app.route("/req", methods=["POST", "GET"])
def req():
print(request.args)#输出ImmutableMultiDict([('name', 'Lily'), ('age', '18')]),依然可以使用对字典的操作
return "ok"

request.form与request.args的区别在于:前者保存表单中的参数,后者保存URL中的参数

request.values

1
2
3
4
5
6
7
8
9
10
11
12
request.values #同时保存表单与URL中的参数

print(request.values)
# CombinedMultiDict([ImmutableMultiDict([('id', '1'), ('age', '20')]), ImmutableMultiDict([('user', 'Oldboy'), ('pwd', 'DragonFire')])])

print(request.values.get("id")) # 1
print(request.values["user"]) # Oldboy

#直接转为字典形式
print(request.values.to_dict()) # {'user': 'Oldboy', 'pwd': 'DragonFire', 'id': '1', 'age': '20'}

# 如果url和form中的Key重名的话,form中的同名的key中value会被url中的value覆盖

request.coolies和request.headers

1
2
request.cookies #不多BB
request.headers

request.data

首先补充一个知识点:

reuqest是基于MIME处理的

MIME(Multipurpose Internet Mail Extensions):描述消息内容类型的因特网标准。

若不属于MIME的范畴,那么request就会将无法处理的参数转为json存入data中

一个获取参数的办法:

1
req_data = json.loads(request.data)

request.files

1
2
3
4
<form action="/req" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
1
2
3
4
print(request.files)  # ImmutableMultiDict([('file', <FileStorage: 'DragonFire.txt' ('text/plain')>)])
print(request.files["file"]) # <FileStorage: 'DragonFire.txt' ('text/plain')>
my_file = request.files["file"]
my_file.save("OldBoyEDU.txt") # 保存文件,里面可以写完整路径+文件名

[TOC]

一,基础知识

1,html标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>

<body>

<!--标题-->
<h1>This is heading 1</h1>

<!--段落-->
<p>请仅仅把标题标签用于标题文本。不要仅仅为了产生粗体文本而使用它们。请使用其它标签或 CSS 代替。</p>

<!--链接-->
<a href="http://www.w3school.com.cn">This is a link</a>

<!--水平线-->
<hr />

<!--图片-->
<img src="w3school.jpg" width="104" height="142" />

</body>
</html>

2,html元素

开始标签 元素内容 结束内容
<p> This is a paragraph </p>
<a href=”default.htm” > This is a link </a>
<br />(定义换行)

特点:

  • 元素始于开始标签,终于结束标签
  • 元素可以具有空内容
  • 空元素以开始标签的结束而结束
  • 大多数html元素可具有属性
  • <p> 元素定义了 HTML 文档中的一个段落
  • <body> 元素定义了 HTML 文档的主体
  • <html> 元素定义了整个 HTML 文档

3,html属性

特点:

  • 以键值对形式出现
  • 总是在开始标签中规定
  • 始终为属性值加引号

例子:

1
<a href="http://www.w3school.com.cn">This is a link</a>

其中,href属性用于指定链接

4,html标题

  • 标题通过<h1>到<h6>等标签定义
  • 其中<h1>定义最大标题,<h6>定义最小标题

二,表单

1,表单

  • 表单用于收集用户输入

  • 包含input元素、复选框、单选按钮、提交按钮等。

  • 提交表单时,默认为GET方法

2,<input>元素

  • <input>元素根据不同type属性分为不同的形态
类型 描述
text 定义常规文本输入
radio 定义单选按钮输入
submit 提交表单

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html>
<body>

<form>
<fieldset>
<legend>Personal information:</legend>
First name:<br>
<input type="text" name="firstname" value="Mickey">
<br>
Last name:<br>
<input type="text" name="lastname" value="Mouse">
<br>
<input type="radio" name="sex" value="male" checked>Male
<br>
<input type="radio" name="sex" value="female">Female
<br><br>
<input type="submit" value="Submit">
</fieldset>
</form>

</body>
</html>

  • 若想要正确的提交,每个输入字段必须设置一个name属性
  • <fieldset>元素组合表单中相关数据
  • <legend>元素为<fieldset>指定标题

①InputType:checkbox

1
2
3
4
5
<form>
<input type="checkbox" name="vehicle" value="Bike">I have a bike
<br>
<input type="checkbox" name="vehicle" value="Car">I have a car
</form>

②InputType:url

1
2
3
4
<form>
Add your homepage:
<input type="url" name="homepage">
</form>