主要内容:
1. http协议http://www.cnblogs.com/liwenzhou/articles/8620663.html
a : 简介:http: 超文本传输协议.是一种用于分布式,协作式和超媒体信息系统的应用层协议.http是万维网的数据通信的基础. http协议中现今应用的一个版本----http 1.1.
b : 概述:http协议是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(tcp).通常由http客户端发起一个请求,创建一个服务器指定端口(默认是80端口))的tcp连接.http服务器则在那个端口监听客户端的请求.一旦收到请求,服务器会向客户端返回一个状态,比如'http/1.1 200 ok',以及返回的内容,如请求的文件.错误信息,或者其他信息
c : 在浏览器地址栏输入url,按下回车之后会经历的流程:
1 浏览器向DNS服务器请求解析该url中的域名所对应的ip地址;
2 解析出ip地址后,根据该ip地址和默认端口80,和服务器建立tcp连接;
3 浏览器发出读取文件(url中域名后面部分对应的文件)的http请求, 该请求报文作为tcp三尺握手的第三个报文的数据发送给服务器.
4 服务器对浏览器作出回应,并把对应的html文档发送给浏览器;
5 释放tcp连接;
6 浏览器将html文本并显示内容;
d : url介绍:超文本传输协议的统一资源定位符将从英特网获取信息的五个基本元素包括在一个而简单的地址中.
传送协议
层级url标记符号(为[//],固定不变)
服务器.(通常为域名,有时为ip地址)
端口号: (以数字方式显示,若为http的默认值:80可省略)
路径(以/字符区别路径中的每一个目录名称)
查询: (GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
片段: 以#字符为起点
以http://www.luffycity.com:80/news/index.html?id=250&page=1为例:
http是协议
www.luffycity.com是服务器;
80,是服务器上的网络端口号
/news/index.html是路径;
?id=250&page= 1是查询
e : http的请求格式和响应格式:
请求格式 包括请求行,请求头部,请求数据
格式为: 请求行的格式: 请求方法 空格 url 空格 协议版本 回车符 换行符
请求头部的格式: 头部字段名:值 回车符 换行符
请求数据: 回车符 换行符
响应格式 包括状态行,响应头部,响应正文
格式为: 状态行的格式: 协议版本 空格 状态码 空格 状态码描述 回车符 换行符
响应头部的格式: 头部字段名:值 回车符 换行符
响应正文的格式: 回车符 换行符 正文(可没有)
2 Python中Web框架的分类
a: 收发socket消息,按照http协议解析消息 web服务程序 wsgiref, gunicorn,uWSGI
b : 字符串的替换
c: 业务逻辑处理
自己实现a,b,c的tornado
自己实现b和c,使用别人的a的Django
自己使用c,使用别人的a和b的Flask
3 Django安装
安装指令: pip install Django == 1.11.11(卸载:django:pip uninstall django)
创建第一个Django项目:
1 命令行创建: django-admin startproject 项目名
2 pycharm :File -> new Project -> 左侧选第二项,右侧第一项是路径,第二项是选python版本
在新的PyCharm窗口打开新建的Django项目
3 启动Django项目:
命令行启动: 在Django项目的根目录下,执行下面的命令 python manage.py runserver
停止:Ctrl + C
pycharm启动: 点击绿色三角, 左边框里的名字一定是项目名称
4 代码实例
import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() while 1: conn, addr = sk.accept() msg = conn.recv(8888) # 把收到的数据为字节转换成字符串 msg_str = str(msg, encoding='utf-8') # 取到第一项内容 first_line = msg_str.split(' ')[0] print(first_line) #按照要求的结果进行切割 url = first_line.split(' ')[1] print(url) if url == '/abc/': re_msg = b'right' elif url == '/123/': re_msg = b'good' else: re_msg = b'not found 404' conn.send(b'http/1.1 200 ok ') conn.send(re_msg)
不同的路径返回不同结果函数版
import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() def abc(url): data = 'is a king:{}'.format(url) return bytes(data, encoding='utf8') def ot(url): data = 'is a kind' return bytes(data, encoding='utf8') def others(url): return b'right' while 1: conn, addr = sk.accept() data = conn.recv(8888) print(data) data_str = str(data, encoding='utf8') first_line = data_str.split(' ')[0] url = first_line.split(' ')[1] if url == '/abc/': re_msg = abc(url) elif url == '/123/': re_msg = ot(url) else: re_msg = others(url) conn.send(b'http/1.1 200 ok ') conn.send(re_msg)
不同的路径返回不同的结果,函数的进阶
import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() def abc(url): data = 'is a king:{}'.format(url) return bytes(data, encoding='utf8') def ot(url): data = 'is a kind' return bytes(data, encoding='utf8') # url 和函数的对应关系 url_func = [ ('/abc/', abc), ('/mmm/', ot) ] while 1: # --------------------------建立连接就收消息部分--------------------------- conn, addr = sk.accept() data = conn.recv(8888) print(data) # -------------------------将用户发来的消息做处理------------------------- data_str = str(data, encoding='utf8') first_line = data_str.split(' ')[0] url = first_line.split(' ')[1] # -------------------------业务逻辑处理部分------------------------------ # 使用func变量保存将要执行的函数 for i in url_func: if url == i[0]: func = i[1] break else: func = None if func: re_msg = func(url) else: re_msg = b'not found 404' # -------------------------回复响应消息部分----------------------------------- conn.send(b'http/1.1 200 ok ') conn.send(re_msg) conn.close()
返回网页
import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() def abc(url): data = 'is a king:{}'.format(url) return bytes(data, encoding='utf8') def ot(url): data = 'is a kind' return bytes(data, encoding='utf8') # url 和函数的对应关系 url_func = [ ('/abc/', abc), ('/mmm/', ot) ] while 1: # --------------------------建立连接就收消息部分--------------------------- conn, addr = sk.accept() data = conn.recv(8888) print(data) # -------------------------将用户发来的消息做处理------------------------- data_str = str(data, encoding='utf8') first_line = data_str.split(' ')[0] url = first_line.split(' ')[1] # -------------------------业务逻辑处理部分------------------------------ # 使用func变量保存将要执行的函数 for i in url_func: if url == i[0]: func = i[1] break else: func = None if func: re_msg = func(url) else: re_msg = b'not found 404' # -------------------------回复响应消息部分----------------------------------- conn.send(b'http/1.1 200 ok ') conn.send(re_msg) conn.close()
5 Django内部的介绍:
from django.conf.urls import url from django.contrib import admin from django.shortcuts import HttpResponse,render # HttpResponse给封装响应头 # render的作用: 返回一个html页面 def login(request): ''' :param request: 所有跟请求相关的数据都封装到了这个request对象里面 :return: ''' return render(request,'login.html') # return HttpResponse ('ok') urlpatterns = [ url(r'^login/', login), ]
setting配置文件的设置:
templates:; 跟文件相关的配置
STATIC_URL = '/static/' 别名 ,HTML中找静态文件如(css文件, js文件, image图片) 都要以这个别名开头
STATICFILES_DIRS = [os.path.join(BASE_DIR, ''static)] 我这个django项目中用到的静态文件都保存在哪些目录