Django

web框架本质

浏览器把你输入的网址,做成请求(请求头),如果是域名,通过dns解析服务器解析出对方服务器地址,然后把请求通过socket发送到对方地址,对方服务器socket接收到请求,查询相应的文件,返回结果(成功 200)并把文件返回到发送端的socket,然后呈现到浏览器比如:
http://www.jd.com/245165220002.html
www.jd.com 是服务器域名,会被dns解析成ip地址
245165220002.html才是真正要请求的路径文件

一个web服务器的简单例子

<!--html文件-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>

</head>
<body>
<h1>hello world</h1>
</body>
</html>
#python server文件,
import socket
sc = socket.socket()
sc.bind(('127.0.0.1',8080))
sc.listen()
while 1:
    conn,addr = sc.accept()
    data = conn.recv(1024) #接收请求头
    print(data.decode('utf-8')) #解码
    conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8')) #发送响应结果
    with open('test.html','rb') as f1: #发送文件给浏览器
        conn.send(f1.read())
    conn.close()
先运行起来python文件,浏览器输入 127.0.0.1:8080 ,服务器返回一个html文件,并在浏览器终端显示

请求和响应格式

上述的例子在server的控制台有如下的记录,这个是浏览器的请求头,其中第一行GET / HTTP/1.1中,GET是请求方法,/是个请求的文件, HTTP/1.1是协议

标准的请求格式:

升级的web框架

#上面的html太简单,如果增加一些引用,比如样式:<link rel="stylesheet" href="css1.css"> ,样式文件中增加一些背景色,让界面复杂一些,就要更改下server端,新建一个css文件,把css文件也发送到客户端:
import socket
sc = socket.socket()
sc.bind(('127.0.0.1',8080))
sc.listen()
while 1:
    conn,addr = sc.accept()
    data = conn.recv(1024)
    request_file = data.decode('utf-8').split('\r\n')[0].split()[1] #根据标准请求头结构,解析出文件名,要先decode
    print(data.decode('utf-8'))
    conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
    if request_file == '/': #开始判断请求的具体是哪个文件
        with open('test.html','rb') as f1:
            conn.send(f1.read())
    elif request_file == '/css1.css':
        with open('css1.css','rb') as f1:
            conn.send(f1.read())
    conn.close()
#这样的话 也可以添加 js文件 img图片文件的src链接等

并发的web框架

#把服务器返回文件分别写在函数中,并发的方式返回给请求端
import socket
from threading import Thread
sc = socket.socket()
ip_port=('127.0.0.1',8800)
sc.bind(ip_port)
sc.listen()

def html(conn):
    with open('test.html', 'rb') as f:
        content = f.read()
        conn.send(content)
        conn.close()

def css(conn):
    with open('css1.css', 'rb') as f:
        content = f.read()
        conn.send(content)
        conn.close()

def js(conn):
    with open('js1.js', 'rb') as f:
        content = f.read()
        conn.send(content)
        conn.close()

def jquery_js(conn):
    with open('jquery-3.5.1.js', 'rb') as f:
        content = f.read()
        conn.send(content)
        conn.close()

def png(conn):
    with open('1.png', 'rb') as f:
        content = f.read()
        conn.send(content)
        conn.close()

request_list = [('/',html),('/css1.css',css),('/js1.js',js),('/jquery-3.5.1.js',jquery_js),('/1.png',png)] #罗列请求的内容

while 1:
    conn,addr=sc.accept()
    data = conn.recv(1024)    # data是请求头
    print(data.decode('utf-8'))
    conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
    request_path = data.decode('utf-8').split('\r\n')[0].split()[1]    # 按照回车换行分割,获取请求的文件名
    print(request_path)

    for i in request_list:
        if request_path == i[0]:
            print(i[0])
            t = Thread(target=i[1],args=(conn,))  #target 是函数,args 是参数,对应上面多个函数
            t.start()

动态web框架

<!-- html 文件增加一个 <div>{time_now}</div> -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <link rel="stylesheet" href="css1.css">
    <script src="jquery-3.5.1.js"></script>
    <script src="js1.js"></script>

</head>
<body>
    <div>{time_now}</div>  <!--模拟数据库,获取后台传入的当前时间-->

</body>
</html>
import socket
import time
from threading import Thread

sc = socket.socket()
ip_port=('127.0.0.1',8800)
sc.bind(ip_port)
sc.listen()

def html(conn):
    time_now = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime()) #增加一个日期变量,传入到网页中
    with open('test.html', 'rb') as f:
        content = f.read().decode('utf-8').format(time_now=time_now) #content是个字符串,用一个format格式化一下内部的参数
        conn.send(content.encode('utf-8'))
        conn.close()

def css(conn):
    with open('css1.css', 'rb') as f:
        content = f.read()
        conn.send(content)
        conn.close()

def js(conn):
    with open('js1.js', 'rb') as f:
        content = f.read()
        conn.send(content)
        conn.close()

def jquery_js(conn):
    with open('jquery-3.5.1.js', 'rb') as f:
        content = f.read()
        conn.send(content)
        conn.close()

def png(conn):
    with open('1.png', 'rb') as f:
        content = f.read()
        conn.send(content)
        conn.close()

request_list = [('/',html),('/css1.css',css),('/js1.js',js),('/jquery-3.5.1.js',jquery_js),('/1.png',png)] #罗列请求的内容

while 1:
    conn,addr=sc.accept()
    data = conn.recv(1024)    # data是请求头
    print(data.decode('utf-8'))
    conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
    request_path = data.decode('utf-8').split('\r\n')[0].split()[1]    # 按照回车换行分割,获取请求的文件名
    print(request_path)

    for i in request_list:
        if request_path == i[0]:
            print(i[0])
            t = Thread(target=i[1],args=(conn,))  #target 是函数,args 是参数,对应上面多个函数
            t.start()

【20210127】

#之前socket相关的那段代码是服务器程序,用来接收别人的请求,然后处理请求,这些操作wsgi已经帮我们封装好,可以引入wsgiref的python模块来替换我们自己开发的部分socket代码,看python文件中的变化
<!--test.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <link rel="stylesheet" href="css1.css">
    <script src="jquery-3.5.1.js"></script>
    <script src="js1.js"></script>

</head>
<body>
    <div>{time_now}</div>
    <input type="button" value="提交">
</body>
</html>
//js1.js文件
$(window).ready(function(){
    $('input[type=button]').click(function(){ //按钮事件
        $('div').css('background-color','red');
    });
})
/*css1.css文件*/
div{
    background-color:pink;
}
import socket
import time
from wsgiref.simple_server import make_server

def html():
    time_now = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime()) #传一个日期到网页前端
    with open('test.html', 'rb') as f:
        content = f.read().decode('utf-8').format(time_now=time_now)
        return content.encode('utf-8')

def css():
    with open('css1.css', 'rb') as f:
        content = f.read()
        return content

def js():
    with open('js1.js', 'rb') as f:
        content = f.read()
        return content

def jquery_js():
    with open('jquery-3.5.1.js', 'rb') as f:
        content = f.read()
        return content

def png():
    with open('1.png', 'rb') as f:
        content = f.read()
        return content

request_list = [('/',html),('/css1.css',css),('/js1.js',js),('/jquery-3.5.1.js',jquery_js),('/1.png',png)] #罗列请求的内容


def application(environ,start_response): #应用程序
    start_response('200 OK',[('k1','v1'),('k2','v2')]) #首先响应
    print(environ) #environ是接收的内容,包括请求头信息
    request_path = environ['PATH_INFO']
    for i in request_list:
        if request_path == i[0]:
            ret = i[1]()
            return [ret]
    else:
        return [b'<h1>404, file not found!</h1>']
httpd = make_server('127.0.0.1',8080,application) #创建一个服务器,用来处理请求,替换之前的socket
print('serving http on port 8080...')
httpd.serve_forever() #开始监听

wsgiref+mysql+html

#在前面的基础上添加一个数据库的访问
<!--test.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <link rel="stylesheet" href="css1.css">
    <script src="jquery-3.5.1.js"></script>
    <script src="js1.js"></script>

</head>
<body>
    <div>{time_now}</div>
    <span>欢迎<span style="font-weight:bolder">{name}</span>访问!</span>
</body>
</html>
import socket
import time
from wsgiref.simple_server import make_server
import pymysql

def getName(): #数据库获取姓名 ,这个方法可以单独写到操作数据库的python文件中,独自成立模块
    conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='test')
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = "select name from t_user where id=2"
    cursor.execute(sql)
    data = cursor.fetchone()
    conn.commit()
    cursor.close()
    conn.close()
    return data #data结果是个字典形式存储,如果两行就是字典组成的列表,需要用索引获取name值



def html():
    time_now = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime())
    with open('test.html', 'rb') as f:
        content = f.read().decode('utf-8').format(time_now=time_now,name=getName()['name']) #把值格式化format到content字符串中,把数据库内容渲染到网页中,以后还会有表格的渲染,那样渲染数据就更多了
        return content.encode('utf-8')

def css():
    with open('css1.css', 'rb') as f:
        content = f.read()
        return content

def js():
    with open('js1.js', 'rb') as f:
        content = f.read()
        return content

def jquery_js():
    with open('jquery-3.5.1.js', 'rb') as f:
        content = f.read()
        return content

def png():
    with open('1.png', 'rb') as f:
        content = f.read()
        return content

request_list = [('/',html),('/css1.css',css),('/js1.js',js),('/jquery-3.5.1.js',jquery_js),('/1.png',png)] 


def application(environ,start_response): 
    start_response('200 OK',[('k1','v1'),('k2','v2')]) 
    print(environ) 
    request_path = environ['PATH_INFO']
    for i in request_list:
        if request_path == i[0]:
            ret = i[1]()
            return [ret]
    else:
        return [b'<h1>404, file not found!</h1>']
httpd = make_server('127.0.0.1',8080,application) 
print('serving http on port 8080...')
httpd.serve_forever() 
#结果如下图:

wsgiref+mysql+jinja2

以上方式只是简单渲染,渲染实现了数据和显示的分离,后台数据再网页端用特殊代码代替,还有一种现成的渲染方式jinja2,先pip install jinja2安装下,jinja2适用很多框架,Django,Flask

【20210128】

Django安装(现在才开始Django)

pip install django #命令提示符执行,安装django

命令方式创建一个Django项目

django-admin startproject mysite2 #命令提示符界面执行语句,在当前目录下得到如下的一堆文件,还要在环境变量中才行

#django是个创建项目的工具,可以理解成模块
#manage.py 项目的启动文件
#setting.py 包含项目默认设置,数据库信息,调试标志等
#urls.py 负责把url模式映射到应用程序
#wsgi.py wsgiref模块做简单的web server,和socket有关
#自动生成的这几个文件中没有template,view等文件,这里的mysite2只是一个项目,具体的网站blog还需要再执行以下命令,blog相当于项目中的应用,一个项目可以有很多应用
python manage.py startapp blog #当前路径多出以下文件

#其中
#models.py 是存放表结构的,现在才出现所谓的 MVT 模型
#views.py 是视图函数相关的
python manage.py runserver 8085 #启动项目,如下是个空网站,manage.py文件跟启动有关

用pycharm 创建Django项目

#得到如下一堆文件

下面走通整个项目,让index路径能访问

#配置url.py文件

#配置views.py文件

#settings.py 文件还要添加一句引用

#然后在manage.py文件目录下,命令提示符界面运行一下指令,启动项目
python manage.py runserver 8085
#然后网页端输入 127.0.0.1:8085/index 就会有如下结果:

#如何返回html文件呢
#views文件更改下,然后创建一个login.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
<form action="/index/" method="post">
    <label for="name">账号:</label>
    <input type="text" id="name">
    <label for="pwd">密码:</label>
    <input type="password" id="pwd" >
    <input type="submit">
</form>

</body>
</html>
#前端再访问下 127.0.0.1:8085/index 如下图:

posted on 2021-01-26 16:59  94小渣渣  阅读(97)  评论(0编辑  收藏  举报