zoukankan      html  css  js  c++  java
  • Django框架

    Django框架

    Web应用的组成

    学习Django的目的就是为了开发一个web应用程序,而web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览器,需要强调的一点是S端由server和application两大部分构成

    开发一个web应用

    只需要开发服务端s端就行,浏览器本身就是一个最大的c端客户端

    这边需要注意的是浏览器在接收s端发来的消息时无法正常解析,因为浏览器与s端之间收发消息默认使用的应用层协议是HTTP,浏览器默认会按照HTTP协议规定的格式发消息,而S端也必须按照HTTP协议的格式回消息才行。所以S端需要在处理HTTP协议的请求消息的时候按照HTTP协议的格式回复消息。

    HTTP协议(超文本协义)

    四大特性

    1. 基于TCP/IP之上作用于应用层
    2. 基于请求响应(发是请求,给是响应)
    3. 无状态(不保存用户状态,连一次就忘(就算同一个人,每一次链接都当成新的人来接待))
    4. 无连接(one night love , 限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接 )

    数据格式

    请求格式:

    ​ 请求首行(请求方式,协议版本)

    ​ 请求头(K:V键值对)

    ​ /r/n (空格)

    ​ 请求体(真正的数据 发post请求的时候才有 如果是get请求是不会有 的)

    响应格式:

    ​ 响应首行

    ​ 响应头

    ​ /r/n

    ​ 响应体

    响应状态码

    用特定的数字表示一些数据

    1xx:服务端已经接收到了你的数据 正在处理 你可以提交其他数据

    2xx:服务端成功响应(200请求成功)

    3xx:重定向

    4xx:请求错误(404 请求资源不存在 403 拒绝访问)

    5xx:(服务器内部错误(500))

    请求方式

    ​ get请求

    ​ 朝别人要数据

    ​ post请求

    ​ 向别人提交数据(用户登录)

    纯手撸web框架

    • 手动书写socket
    • 手动处理http格式数据

    简单c/s连接

    #服务端
    import socket
    server = socket.socket()
    server.bind(('127.0.0.1', 8081))
    server.listen(5)
    while True:
        conn,addr = server.accept()
        data = conn.recv(1024)
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        print(data)
        conn.send(b'hello baby')
        conn.close()
    

    稍微复杂web框架

    客户端请求什么,就返回什么,eg:客户端发送http://127.0.0.1:8081/index则服务器返回给客户端index

    import socket
    server = socket.socket()
    server.bind(('127.0.0.1', 8081))
    server.listen(5)
    while True:
        conn,addr = server.accept()
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        data = conn.recv(1024)
        print(data)
        data = data.decode('utf8')
        current_path = data.split('
    ')[0].split(' ')[1]
        print(current_path)
        if current_path == '/index':
            conn.send(b'index')
            #服务端还可以打开html文件,将文件中的东西显示给客户端
            # with open(r'index.html', 'rb') as f:   
            #     conn.send(f.read())
        else:
            conn.send(b'404 error')
        conn.close()
    

    基于wsgiref

    如果我不想写上面代码中的socket连接和里面的index等内容,客户端发送100个不同的请求,我也不能手撸100遍啊!那也太累了吧,所以我们就利用了wsgiref模块,帮我们操作起来更简单和方便,我们可以把在wsgiref.py中的必要代码写在相对应的文件内,以下是各个文件中要放的东西。

    urls.py 路由与视图函数对象关系
    views.py 放的是视图函数(处理业务逻辑的)
    templates 模板文件夹(一堆html文件)

    wsgiref.py文件

    from wsgiref.simple_server import make_server
    from urls import urls
    from views import *
    
    
    def run(env,response):
        """
        :param env: 请求相关的所有数据
        :param response: 响应相关的所有数据
        :return:
        """
        response('200 OK',[])
        current_path = env.get('PATH_INFO')  #env里面有 很多数据,我们筛选有用的数据就行
        # 先定义一个变量名 用来存储后续匹配到的函数名
        func = None
        # for循环 匹配后缀
        for url in urls:
            if current_path == url[0]:
                func = url[1]  # 一旦匹配成功 就将匹配到的函数名赋值给func变量
                break  # 主动结束匹配
        # 判断func是否有值
        if func:
            res = func(env)
        else:
            res = error(env)
        return [res.encode('utf-8')]
    
    if __name__ == '__main__':
        server = make_server('127.0.0.1',8080,run)
        # 实时监听该地址  只要有客户端来连接 统一交给run函数去处理
        server.serve_forever()  # 启动服务端,永远等着客户端来连接
    

    urls.py

    from views import *
    
    urls = [
        ('/index',index),  #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
        ('/login',login),
        ('/xxx',xxx),
    ]
    

    views.py

    from urls import urls
    
    def index(env):
        return 'index'
    
    
    def login(env):
        return 'login'
    
    def error(env):
        return '404 error'
    
    
    def xxx(env):
        return 'xxx'
    

    客户端通过访问服务器获取字典

    我们这里需要用到一个模块jinja2

    我们需要先去下载这个模块from jinja2 import Template

    具体了解jinja2请点击链接https://www.cnblogs.com/yanjiayi098-001/p/11701150.html

    wsgiref.py文件

    from wsgiref.simple_server import make_server
    from urls import urls
    from views import *
    
    
    def run(env,response):
        """
        :param env: 请求相关的所有数据
        :param response: 响应相关的所有数据
        :return:
        """
        response('200 OK',[])
        current_path = env.get('PATH_INFO')  #env里面有 很多数据,我们筛选有用的数据就行
        # 先定义一个变量名 用来存储后续匹配到的函数名
        func = None
        # for循环 匹配后缀
        for url in urls:
            if current_path == url[0]:
                func = url[1]  # 一旦匹配成功 就将匹配到的函数名赋值给func变量
                break  # 主动结束匹配
        # 判断func是否有值
        if func:
            res = func(env)
        else:
            res = error(env)
        return [res.encode('utf-8')]
    
    if __name__ == '__main__':
        server = make_server('127.0.0.1',8080,run)
        # 实时监听该地址  只要有客户端来连接 统一交给run函数去处理
        server.serve_forever()  # 启动服务端,永远等着客户端来连接
    

    urls.py

    urls = [
        ('/get_user',get_user),  #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
        
    ]
    

    views.py

    def get_user(env):
        d = {'name':'jason','pwd':'123','hobby':['read','running','music']}
        with open(r'get_user.html','r',encoding='utf-8') as f:
            data = f.read()
        temp = Template(data)   #将data数据传给这个temp,做处理
        res = temp.render(user=d)  # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
        return res
    

    get_user.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    #jinja2模块,可以对字典 进行以下取值,同时这是jinja变量取值 {{ }}的语法
    <p>{{ user }}</p>
    <p>{{ user.name }}</p>
    <p>{{ user['pwd'] }}</p>
    <p>{{ user.get('hobby') }}</p>
    </body>
    </html>
    
    

    动静态页面

    静态页面:就是一个写死的页面

    动态页面:可以通过更改后端的数据,来反应到浏览器的页面上

    eg:

    1. 后端获取当前时间展示到前端
    2. 后端获取数据库中的数据展示到前端
  • 相关阅读:
    C++赌博游戏
    数据挖掘--数据准备
    非线性维归约Isomap
    ClampedCubicSpline
    Romberg算法
    列表与数组
    HttpClient调用webApi时注意的小问题
    Week4
    Week3
    Week2
  • 原文地址:https://www.cnblogs.com/zhouxuchong/p/11749090.html
Copyright © 2011-2022 走看看