首页 > 其他 > 详细

Django

时间:2020-01-03 17:27:37      阅读:76      评论:0      收藏:0      [点我收藏+]

Web框架本质

我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。

import socket


server = socket.socket()
server.bind((127.0.0.1,8080))
server.listen(5)

while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    print(data)  # 将浏览器发来的消息打印出来
    conn.send(b"OK")
    conn.close()

 

可以说Web服务本质上都是在这十几行代码基础上扩展出来的。

用户的浏览器一输入网址,会给服务端发送数据,那浏览器会发送什么数据?怎么发?这个谁来定? 你这个网站是这个规定,他那个网站按照他那个规定,这互联网还能玩么?

所以,必须有一个统一的规则,让大家发送消息、接收消息的时候有个格式依据,不能随便写。

这个规则就是HTTP协议,以后浏览器发送请求信息也好,服务器回复响应信息也罢,都要按照这个规则来。

HTTP协议主要规定了客户端和服务器之间的通信格式,那HTTP协议是怎么规定消息格式的呢?

让我们首先打印下我们在服务端接收到的消息是什么。

输出结果:

"""
请求首行
b‘GET / HTTP/1.1\r\n
请求头
Host: 127.0.0.1:8080\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n
请求体
......
"""

要想让我们自己写的web server端正经起来,必须要让我们的Web server在给客户端回复消息的时候按照HTTP协议的规则加上响应状态行,这样我们就实现了一个正经的Web框架了

import socket


server = socket.socket()
server.bind((127.0.0.1,8080))
server.listen(5)

while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    #给回复的信息加上响应状态行
    conn.send(bHTTP/1.1 200 OK\r\n\r\n)
    conn.send(bhello world)
    print(data)

我们通过十几行代码简单地演示了web 框架的本质。

接下来就让我们继续完善我们的自定义web框架吧!

根据不同的路径返回不同的内容

这样就结束了吗? 如何让我们的Web服务根据用户请求的URL不同而返回不同的内容呢?

我们可以从请求相关数据里面拿到请求URL的路径,然后拿路径做一个判断...

技术分享图片

 

 

 

import socket


server = socket.socket()
server.bind((127.0.0.1,8080))
server.listen(5)

while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    conn.send(bHTTP/1.1 200 OK\r\n\r\n)
    data = data.decode(utf-8)  # 把从浏览器那里收到的字节类型的数据转换成字符串
    # print(data)
    target_url = data.split(\r\n)[0].split( )[1]  #按\r\n分割
    # 根据不同的路径返回不同内容
    if target_url == /index:
        # conn.send(b‘index‘)
        with open(rD:\demo.html,rb) as f:
            conn.send(f.read())
    elif target_url == /login:
        conn.send(blogin)
    else:
        conn.send(b404 error)
    conn.close()

 

基于wsgiref模块:

根据功能的不同拆分成不同的文件,用户在浏览器窗口输入url之所以能够获取到相应的资源,是因为后端早已经开设了相应的资源接口 

基于wsgiref模块以及文件拆分的特点:

若要开设新的资源
1.先在urls文件中写url与函数的对应关系
2.再去views文件中写对应的函数

urls.py:路由与视图函数的对应关系
views.py:里面就是放的一堆视图函数(视图函数可以是函数也可以是类)
templates文件夹:里面放的就是一堆html文件(模板文件夹)

 

动静态网页

静态网页:数据是写死的,万年不变

动态网页:数据是动态获取的,如获取当前时间,从数据库中取数据

 

jinja2模块 

提供了一个可以在html页面上书写类似于python后端的代码 来操作数据(模板语法) ,flask框架模板语法使用的就是jinja2模块,所以你只要下了flask框架 就会自动下载jinja2 

模板语法(jinja2模板语法非常贴近python语法 但是并不是所有的框架使用的都是jinja模板语法)

技术分享图片
{{ xxx }}
<p>{{xxx.username}}</p>
<p>{{xxx[password]}}</p>
<p>{{xxx.get(hobby)}}</p>
<p>{{xxx.get(hobby)[0]}}</p>
<p>{{xxx.get(hobby).1}}</p>
View Code
技术分享图片
{%for user_dict in xxx %}
    <tr>
        <td>{{ user_dict.id }}</td>
        <td>{{ user_dict.name }}</td>
        <td>{{ user_dict.hobby }}</td>
    </tr>
{% endfor %}
View Code

 

 

 

 

 

 

 

 

 

 

Django

原文:https://www.cnblogs.com/baohanblog/p/12145356.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!