zoukankan      html  css  js  c++  java
  • day052 http协议,web框架、Django初识

    本节内容:

    1、http协议
    2、web框架的概念
    3、Django简介(初识引入)
    

    一、http协议

    Hypertext Transfer Protocol,超文本传输协议
    
    所谓协议,就是指双方遵循的规范。http协议,
    就是浏览器和服务器之间进行“沟通”的一种规范。
    
    http是属于“应用层的协议”,而且是基于TCP/IP协议的。
    解释:首先是基于TCP/ip协议,然后在此基础上还有应用层的协议
    

    1、http连接的时限

    那么我们在给服务端发送请求时,得到响应后,是否还保持的跟服务端的连接:
    解释:
    1、在最初的http协议,得到响应结果后,连接是断开的,
    此时考虑的是释放给其他人连接,不让你长久占用连接,服务器端立即关闭连接、释放资源。
    
    2、现在的http协议,会在你拿到响应结果后,保持一小段时间连接(大概几秒钟),
    这样在你又点击时,不用开辟新的连接,从而提高资源利用。
    

    2、http协议是无状态,(不会保存之前的记录)

    也就是“服务器不知道你客户端干了啥”,其实很大程度上是基于性能考虑的。
    后来有些业务需要查询之前的记录,只是coockie缓存就登场了,
    后面详细介绍
    

    3、请求协议格式:浏览器丢给服务器的(重点)

    一般我们不怎么考虑这个格式,因为浏览器会帮我们弄好这一套协议
    
    一个完整的http请求消息,包含一个请求行,若干个消息头(请求头),换行,实体内容
    
    请求方式:1、get的话是将路径拼接在域名后,数据也是,大小有限制,
    2、post这是写在实体内容里,不会显示在URL中,数据大小不限,但还是有安全问题
    
    请求行:描述客户端的请求方式、请求资源的名称、http协议的版本号。 例如: GET/BOOK/JAVA.HTML HTTP/1.1
    
    请求头(消息头)包含(客户机请求的服务器主机名,客户机的环境信息等):
    Accept:用于告诉服务器,客户机支持的数据类型  (例如:Accept:text/html,image/*)
    Accept-Charset:用于告诉服务器,客户机采用的编码格式
    Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式
    Accept-Language:客户机语言环境
    Host:客户机通过这个服务器,想访问的主机名
    If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间
    Referer:客户机通过这个头告诉服务器,它(客户端)是从哪个资源来访问服务器的(防盗链)
    User-Agent:客户机通过这个头告诉服务器,客户机的软件环境(操作系统,浏览器版本等)
    Cookie:客户机通过这个头,将Coockie信息带给服务器
    Connection:告诉服务器,请求完成后,是否保持连接
    Date:告诉服务器,当前请求的时间
    
    (换行)
    实体内容:
    就是指浏览器端通过http协议发送给服务器的实体数据。例如:name=dylan&id=110
    (get请求时,通过url传给服务器的值。post请求时,通过表单发送给服务器的值)
    

    4、http响应协议格式:服务器返回给浏览器的(重点)

    一个状态行,若干个消息头,以及实体内容
    
    响应头(消息头)包含:
    Location:这个头配合302状态吗,用于告诉客户端找谁
    Server:服务器通过这个头,告诉浏览器服务器的类型
    Content-Encoding:告诉浏览器,服务器的数据压缩格式
    Content-Length:告诉浏览器,回送数据的长度
    Content-Type:告诉浏览器,回送数据的类型
    Last-Modified:告诉浏览器当前资源缓存时间
    Refresh:告诉浏览器,隔多长时间刷新
    Content-Disposition:告诉浏览器以下载的方式打开数据。例如: context.Response.AddHeader("Content-Disposition","attachment:filename=aa.jpg");                                        context.Response.WriteFile("aa.jpg");
    Transfer-Encoding:告诉浏览器,传送数据的编码格式
    ETag:缓存相关的头(可以做到实时更新)
    Expries:告诉浏览器回送的资源缓存多长时间。如果是-1或者0,表示不缓存
    Cache-Control:控制浏览器不要缓存数据   no-cache
    Pragma:控制浏览器不要缓存数据          no-cache
    
    Connection:响应完成后,是否断开连接。  close/Keep-Alive
    Date:告诉浏览器,服务器响应时间
    
    状态行:  例如:  HTTP/1.1  200 OK   (协议的版本号是1.1  响应状态码为200  响应结果为 OK)
    
    实体内容(实体头):响应包含浏览器能够解析的静态内容,例如:html,纯文本,图片等等信息
    
    关于http协议的更多具体细节,可以参照http RFC文档。
    

    第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
    第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
    
    第二部分:消息报头,用来说明客户端要使用的一些附加信息
    第二行和第三行为消息报头,
    Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
    
    第三部分:空行,消息报头后面的空行是必须的
    第四部分:响应正文,服务器返回给客户端的文本信息。
    空行后面的html部分为响应正文。
    

    1、响应状态码

    详解

    状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求
    
    常见状态码:
    
    200 OK                        //客户端请求成功
    400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
    403 Forbidden                 //服务器收到请求,但是拒绝提供服务
    404 Not Found                 //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error     //服务器发生不可预期的错误
    503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
    

    二、web应用与web框架

    对于所有的Web应用,本质上其实就是一个socket服务端,
    用户的浏览器其实就是一个socket客户端。
    

    1、web应用的本质

    最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,
    接收用户请求,从文件中读取HTML,返回。
    

    代码示例

    import socket
    
    sock=socket.socket()
    sock.bind(("127.0.0.1",8800))
    sock.listen(5)
    
    while 1:
        conn,addr=sock.accept()
        recv_data=conn.recv(1024)
        print("recv_data:",recv_data)
        #conn.send(b"HTTP/1.1 200 ok
    content-length:12
    
    Hello World!")
    
        with open("login.html","rb") as f:
            data=f.read()
        conn.send(b"HTTP/1.1 200 ok
    
    "+data)
        conn.close().
    
    Python

    2、基于wsgiref模块的自定义的web,详细示例

     正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。
    
     因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,
     所以,需要一个统一的接口,让我们专心用Python编写Web业务。
    
     这个接口就是WSGI:Web Server Gateway Interface。
     示例看一遍,知道过程就行了,为得是为后面知道Django的各个文件的作用
     重点是Django
    

    初步示例1

    from wsgiref.simple_server import make_server
    
    
    def application(environ, start_response):
        #print("environ",environ)
        start_response('200 OK', [('Content-Type', 'text/html')])
        # 获取当前请求路径
        print("PATH_INFO",environ.get("PATH_INFO"))
        path=environ.get("PATH_INFO")
        # 分支
        if path == "/login":
            with open("login.html","rb") as f:
                data=f.read()
            return [data]
        elif path == "/index":
            with open("home.html", "rb") as f:
                data = f.read()
            return [data]
        else:
            return [b"<h1>404!</h1>"]
    
    
    httpd = make_server('', 8080, application)
    # 开始监听HTTP请求:
    httpd.serve_forever()
    
    Python

    初步示例2

    from wsgiref.simple_server import make_server
    # 视图函数
    def home():
        with open("home.html", "rb") as f:
            data = f.read()
        return data
    
    def login():
        with open("login.html", "rb") as f:
            data = f.read()
        return data
    
    def application(environ, start_response):
        #print("environ",environ)
        start_response('200 OK', [('Content-Type', 'text/html')])
        # 获取当前请求路径
        print("PATH_INFO",environ.get("PATH_INFO"))
        path=environ.get("PATH_INFO")
        # 分支
        if path == "/login":
           ret=login()
        elif path == "/index":
            ret=home()
        else:
            ret=b"<h1>404!</h1>"
    
        return [ret]
    
    httpd = make_server('', 8080, application)
    # 开始监听HTTP请求:
    httpd.serve_forever()
    
    Python

    初步示例3

    from wsgiref.simple_server import make_server
    # 视图函数
    def home():
        with open("home.html", "rb") as f:
            data = f.read()
        return data
    
    def login():
        with open("login.html", "rb") as f:
            data = f.read()
        return data
    
    
    def notFound():
        return  b"<h1>404!!!</h1>"
    
    def application(environ, start_response):
        #print("environ",environ)
        start_response('200 OK', [('Content-Type', 'text/html')])
        # 获取当前请求路径
        print("PATH_INFO",environ.get("PATH_INFO"))
        path=environ.get("PATH_INFO")
        # 分支
        urlpatterns=[
            ("/login",login),
            ("/index",home),
        ]
    
        func=None
        for item in urlpatterns:
            if path == item[0]:
                func=item[1]
                break
        if not func:
            ret=notFound()
        else:
            ret=func()
        return [ret]
    
    httpd = make_server('', 8080, application)
    # 开始监听HTTP请求:
    httpd.serve_forever()
    
    Python

    3、DIY一个自己的web框架

    manage.py

    from wsgiref.simple_server import make_server
    from views import *
    from urls import urlpatterns
    
    def application(environ, start_response):
        #print("environ",environ)
        start_response('200 OK', [('Content-Type', 'text/html')])
        # 获取当前请求路径
        print("PATH_INFO",environ.get("PATH_INFO"))
        path=environ.get("PATH_INFO")
        # 分支
        func=None
        for item in urlpatterns:
            if path == item[0]:
                func=item[1]
                break
        if not func:
            ret=notFound(environ)
        else:
            ret=func(environ)
        return [ret]
    
    httpd = make_server('', 8080, application)
    # 开始监听HTTP请求:
    httpd.serve_forever()
    
    Python

    urls.py

    from views import *
    
    urlpatterns = [
        ("/timer",timer)
    ]
    
    Python

    views.py

    # 视图函数
    def timer(environ):
        import datetime
        now=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        return now.encode("utf8")
    def notFound(environ):
        return  b"<h1>404...</h1>"
    
    Python

    三、Django介绍

    1、mvc模型(最典型的MVC就是jsp+servlet+javabean模式)

    MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写
    

    2、mtv模型(Django)

    Django的MTV分别代表:
    
    Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM)
    
    Template(模板):放所有的html文件
    
    模板语法:目的是将白变量(数据库的内容)如何巧妙的嵌入到html页面中
    
    View(视图):负责业务逻辑,并在适当的时候调用Model和Template
    
    此外,Django还有一个URL分发器。
    它的作用是将一个个URL的页面请求分别发给不同的Views处理,Views再调用相应的Model和Template。
    


    2、Django的基本命令

    1、下载Django

    在cmd窗口下,pip install django==2.1.1   (2.1.1是版本号)
    

    2、创建一个Django对象

    django-admin.py  startproject   项目名称
    django-admin.py  startproject    mysite
    

    3、创建一个应用

    python3 manage.py startapp blog(应用名称)
    

    4、启动Django项目

    python manage.py runserver  8080(不写就是默认8000端口)
    

    5、创建表命令

    python3 manage.py makemigrations
    
    python3 manage.py migrate
  • 相关阅读:
    字符的编码
    数据的基本类型和内置方法(二)
    基本的数据类型和内置方法介绍 (一)
    流程运算 if while for
    用户交换 基本数据类型 基本运算符 格式化输出
    机器语言发展简介和变量的介绍
    计算机基础
    Python学习建议和要求总结
    CH135 最大子序和 题解报告
    HRBUST1356 Leyni,罗莉和队列 题解报告
  • 原文地址:https://www.cnblogs.com/yipianshuying/p/10193002.html
Copyright © 2011-2022 走看看