通过requests库使用基本http命令 第一课

在python里,进行http相关的请求,则requests库是事实标准,这个库将复杂的http请求命令,封装在简单、优美的api里。

简单的request如get、post,当然也可以在此基础上增加鉴权功能,或者通过配置请求来防止应用的速度变慢。

安装与引用requests库

使用pip在python里安装requests库,如果是python3,则是pip3

$ pip install requests

使用requests也很简单,如下

import requests

GET请求

最普通常见的HTTP请求是GET。通过get,你可以获得指定的资源。

requsets.get()

Status Codes

Screen Shot 2021-12-05 at 3.04.38 PM
当status_code返回200时,说明你的请求成功,而且服务器返回了你所请求的数据。


因此可以直接利用response的布尔属性来做一些简单判断,不过这种情况就不一定是返回200了,因为只要返回代码在200~400之间,都认为响应成功,但是不一定返回了消息内容(比如204就是这样)

Screen Shot 2021-12-05 at 1.39.28 PM

对比content,text,json等的类型。

解决VS code无法远程写入(写入管道不存在)

使用VS code的remote ssh功能,昨天在mac电脑上一切顺利。今天在设置办公室的windows10,遇到如下报错(使用了参考1文章里的内容,因为我解决问题后,没法复现)

[14:18:57.722] Got some output, clearing connection timeout
[14:18:57.751] > 过程试图写入的管道不存在。
[14:18:58.010] "install" terminal command done
[14:18:58.011] Install terminal quit with output: 过程试图写入的管道不存在。
[14:18:58.011] Received install output: 过程试图写入的管道不存在

解决方法很简单,按照参考文章的建议,将ssh目录下(C:\Users\XXXXX.ssh\known_hosts)的known_hosts文件内记录的服务器信息删除,任何文本编辑器打开后做如下操作,当然不是真的删除,屏蔽就好。

当然,也走了弯路,第一次按照参考2文章去做了修改,发现无效。不过这篇文章也提供了VS Code SSH本地配置文件的修改方法,也算有些用处。

参考1

参考2

套接字python2和python3不同

编写web应用服务器报,TypeError: a bytes-like object is required, not ‘str’错误。
因为python2和python3的版本有些差异,而python3最重要的新特性也是对文本和二进制数据做了更清晰的区分。

文本用unicode编码,为str类型,二进制数据则为bytes类型

python2的例子

import socket,sys 

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('www.madapapa.com',80))
#code=str.encode('GET /api.json HTTP/1.0\r\n\r\n')
#s.send(code)
s.send('GET /api.json HTTP/1.0\r\n\r\n')

while 1:
    buf = s.recv(1000)
    if not buf:
        break
    sys.stdout.write(buf)

s.close()

在python2的环境下运行,执行结果如下
Screen Shot 2021-11-14 at 2.45.47 PM

python3的例子

import socket,sys 

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('www.madapapa.com',80))
#s.send(str.encode('GET /api.json HTTP/1.0\r\n\r\n'))
s.send('GET /api.json HTTP/1.0\r\n\r\n'.encode())


while 1:
    buf = s.recv(1000).decode()
    #s1 = buf.decode()
    if not buf:
        break
    sys.stdout.write(buf)

s.close()

在默认环境下运行(python3),执行结果如下

附录

套接字

套接字是一套用C语言写成的应用程序开发库,它首先是一个库。主要作用就是实现进程间通信和网络编程,因此在网络应用开发中被广泛使用。

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

在Python中可以基于套接字来使用传输层提供的传输服务,并以此进行开发网络应用。实际开发中使用的套接字可以分为三类:流套接字(TCP套接字)、数据报套接字和原始套接字。

流式套接字

流式套接字(SOCK-STREAM)。它提供了一种可靠的、可以进行双向连接的数据传输服务。其实现了数据无差错、无重复的发送。流式套接字自身便内设了流量控制功能。在TCP/IP协议簇中,使用TCP协议来实现字节流的传输,当用户想要发送大批量的数据或者对数据传输有较高的要求时,可以使用流式套接字。

数据报套接字

数据报套接字(SOCK-DGRAM)。它提供了一种不可靠的双向数据传输服务。数据包以独立的形式被发送,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端按发送顺序接收数据。在TCP/IP协议簇中,使用UDP协议来实现数据报套接字。在出现差错的可能性较小或允许部分传输出错的应用场合,可以使用数据报套接字进行数据传输,这样通信的效率较高。

原始套接字

原始套接字(SOCK-RAW)。该套接字允许对较低层协议(如IP或ICMP)进行直接访问,常用于网络协议分析,检验新的网络协议实现,也可用于测试新配置或安装的网络设备。

上述就是套接字的大体知识,对套接字有了一定的了解,我们就可以步入正题了。

TCP套接字

TCP套接字就是上面所说的流式套接字,可以使用TCP协议提供的传输服务来实现网络通信的编程接口。

在Python中可以通过创建socket对象并指定type属性为SOCK_STREAM来使用TCP套接字。

由于一台主机可能拥有多个IP地址,所以作为服务器端的程序,需要在创建套接字对象后将其绑定到指定的IP地址和端口上。

这个端口是指对IP地址的扩展,用于区分不同的服务。

不同的服务通常与相对的端口所绑定。

当服务器收到用户请求时就可以根据端口号来确定到底用户请求的是何种服务。

关于服务于端口的绑定类型,我们会在之后的开发的当中具体描述。

如何用Python设置一个客户端的功能,简易代码如下:

fromsocketimportsocket

def main():

1.创建套接字对象默认使用IPv4和TCP协议

client= socket()

2.连接到服务器 ,指定IP地址和端口

client.connect((‘192.168.1.8’, 1080))

3.从服务器接收数据

print(client.recv(1024).decode(‘utf-8’))

client.close()

if__name__ == ‘main‘:

main()

上述代码就实现了客户端的功能,它可以与服务器进行通信。当然,上述代码只能作为一个最简单的客户端构建方式。更复杂的构建方式,学记将在之后的学习中为大家继续介绍。

一个小小的API测试

在根目录下,编辑一个测试用的api小文件,然后通过浏览器(safari和chrome,地址为本地电脑地址)、终端curl(分别从vps和本地进行)的方式获取该文件。

vi /var/log/nginx/access.log

来查看刚才的api文档的获取记录

139.XXXXX - - [13/Nov/2021:14:34:22 +0800] "GET /api.json HTTP/1.1" 200 22 "-" "curl/7.68.0"(VPS方式)
223.XXXXX - - [13/Nov/2021:14:35:19 +0800] "GET /api.json HTTP/1.1" 200 22 "-" "curl/7.77.0"(本机方式)
223.XXXXX - - [13/Nov/2021:14:36:28 +0800] "GET /api.json HTTP/1.1" 200 22 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"(本机方式)
223.XXXXX - - [13/Nov/2021:14:36:28 +0800] "GET /favicon.ico HTTP/1.1" 404 188 "http://madapapa.com/api.json" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"(本机方式)

下面是刚刚发布了这篇blog后的日志变化情况,可以看到从本机进行了post操作

223.XXXXX - - [13/Nov/2021:14:59:24 +0800] "POST /wordpress/xmlrpc.php HTTP/1.1" 200 3493 "-" "MWeb%20Pro/917 CFNetwork/1325.0.1 Darwin/21.1.0"

CentOS7 与 Ubantu20 默认首页的不同

CentOS7-banwagong

首先,nginx -t发现正确配置文件地址

 [11:10]/nginx -t    
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

然后vi nginx.conf,发现根目录为 /usr/share/nginx/html,编辑index.html即可

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
server {
 listen       80;
 root   /usr/share/nginx/html;
 server_name  localhost;
 #charset koi8-r;
 #access_log  /var/log/nginx/log/host.access.log  main;
 #
 location / {
      index index.php index.html index.htm;

Ubuntu20-aliyun

前序操作和centos相仿,在nginx.conf下没有index.html内容,需要对sites-available下default进行编辑

/etc/nginx/sites-available
 # vi default
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;

        server_name _;

ubuntu nginx配置参考