Django框架导读

Django框架导读

一、课程导读
1.web应用
运行在浏览器上的应用

2.c/s b/s 架构
client/server:客户端服务器架构,C++
brower/server:浏览器服务器架构,Java、Python
底层均是基于socket

3.Python web框架
Django socket用的wsgiref,页面路由自己写的,模板渲染自己写的,功能全面
Flask socket用的第三方,页面路由自己写的,模板渲染自己写的,小而轻
Tornado socket自己写的,页面路由自己写的,模板渲染自己写的,支持高并发
二、原生socket服务
import socket
PORT = 8801
server = socket.socket()
server.bind(('127.0.0.1',PORT))
server.listen(5)
print("服务端启动:http://127.0.0.1:%s" % PORT)

# 1.浏览器采用http协议方式发生请求
while True:
    # 阻塞等待客户端数据
    browser,_ = server.accept()
    # 接收数据
    data = browser.recv(1024).decode('utf-8')
    print(data)
    # 要遵循http协议返回数据:响应行(必须) 响应头 响应体
    browser.send(b'HTTP/1.1 200 OK\r\n') # 响应行(必须),以\r\n结束
    browser.send(b'Content-type:text/html\r\n') # 响应头(可选),服务于响应体
    browser.send(b'\r\n') # 响应规则与响应体内容之间还需要一个\r\n标识分割
    browser.send(b'normal msg') # 响应体(可选)
    browser.send(b'<h1>hello world</h1>') # 响应体(可选)
    browser.close() # 关闭连接(必须关闭每一次连接)

'''
# 请求发来的数据
GET / HTTP/1.1
Host: 127.0.0.1:8801
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
'''
三、http协议
1.什么是http协议:
# HTTP(HyperText Transport Protocol)是超文本传输协议
# 基于TCP/IP协议基础上的应用层协议,底层实现仍为socket
# 基于请求-响应模式:通信一定是从客户端开始,服务器端接收到客户端一定会做出对应响应
# 无状态:协议不对任何一次通信状态和任何数据做保存
# 无连接:一次连接只完成一次请求-响应,请求-响应完毕后会立即断开连接

2.http工作原理(事务)
# 一次http操作称之为一个事务,工作过程可分为四步
# 1.客户端与服务端建立连接
# 2.客户端发生一个http协议指定格式的请求
# 3.服务器端接收请求后,响应一个http协议指定格式的响应
# 4.客户端将服务器的响应显示展现给用户

3.请求报文
# 请求行  请求头  请求体
'''
POST / HTTP/1.1\r\n
Host: 127.0.0.1:8001\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n
\r\n
usr=abc&pwd=123
'''

4.响应报文
# 响应行  响应头  响应体
'''
HTTP/1.1 200 OK\r\n
Content-type:text/html\r\n
\r\n
Login Success
'''

5.状态码
# 1打头:消息通知
# 2打头:请求成功
# 3打头:重定向
# 4打头:客户端错误
# 5打头:服务器端错误
四、项目演变
  • 目录结构
part4
	--keji.jpg
    --login.html
    --server4.py
    --urls.py
    --views.py
  • login.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>login result</title>
</head>
<body>
    <!--my login page => %%res%%-->
    my login page => {{ result }}
    <hr>
    {{my_dic}}
    <hr>

    {% for k in my_dic %}
    <div>{{k}} : {{my_dic[k]}}</div>
    {% endfor %}
</body>
</html>
from wsgiref import simple_server
from part4.urls import urls


PORT = 8804
# create database dg1;
# create table user(usr char(20),pwd char(32));
# insert into user(usr,pwd) values('abc','123');
# 浏览器通过:http://127.0.0.1:8804/login?usr=abc&pwd=123  来模拟get方式登录

def app(environ, response):
    print(environ)
    response("200 OK", [('Content-type', 'text/html')])
    url = environ['PATH_INFO']

    res_dic = {}
    if environ.get('REQUEST_METHOD', None) == "GET" and url == "/login":
        res_str = environ['QUERY_STRING']  # usr=abc&pwd=123
        if res_str:  # 如果没有请求提交的数据,就不需要解析数据
            res_list = res_str.split('&') # ['usr=abc', 'pwd=123']
            for k_v_m in res_list:  # k_v_m: 'usr=abc' | 'pwd=123'
                k_v_l = k_v_m.split('=')  # ['usr', 'abc']  |  ['pwd', '123']
                res_dic[k_v_l[0]] = k_v_l[1]

    resp_data = b'404'
    if url in urls:
        resp_data = urls[url](res_dic)
    return [resp_data]

if __name__ == '__main__':
    server = simple_server.make_server('127.0.0.1', PORT, app)
    print("服务启动:http://127.0.0.1:%s" % PORT)
    # 保持server运行
    server.serve_forever()
from part4.views import *

urls = {
    '/': index,
    '/index': index,
    '/favicon.ico': ico,
    '/login': login,
}
# 结果要返回二进制数据
import pymysql
from jinja2 import Template

def ico(dic=None):
    with open('keji.jpg', 'rb') as f:
        ico_data = f.read()
    return ico_data

def index(dic=None):
    return b'home page'
    pass

def login(dic=None):
    print(dic)
    usr = dic['usr']
    pwd = dic['pwd']
    # 和数据库进行交互
    conn = pymysql.connect(
        host='192.168.32.100',
        db='dg1',
        user='root',
        passwd='123456'
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    row = cursor.execute('select * from user where usr=%s and pwd = %s', [usr, pwd])

    # 模板渲染框架定义了很多模板语法,采用这些语法可以复用html代码
    with open('login.html', 'rt') as f:
        msg = f.read()
    tem = Template(msg)

    if row:
        res = 'login success'
    else:
        res = 'login failed'
    msg = tem.render(result=res, my_dic=dic)
    return msg.encode('utf-8')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值