解析模拟django web框架及如何创建一个django项目

1.模拟django web框架

# web应用

web应用就是可以通过web访问的应用程序。

分为:c/s架构和b/s架构  本质上b/s架构也是c/s架构。

本质上浏览器是一个socket客户端,服务器是一个socket服务端。

# HTTP协议

超文本传输协议:规定了客户端与服务端消息传输的格式。

四大特性:1.基于TCP/IP协议作用于应用层协议。2.基于响应请求。3.无状态(每一次传输都不不会保留状态)。4.无连接。

数据格式之请求

  • 请求首行
  • 请求头(一堆k,v键值对)
  • 请求体(post请求携带数据)

数据格式之响应:

  • 响应首行
  • 响应头(一堆k,v键值对)
  • 响应体(post请求携带数据)

响应状态码:

1xx 服务器已成功接受到你的数正在处理,你可以继续提交其他数据。

2xx 请求成功,服务器已将你请求的数据发送给你

3xx 重定向,需要进一步的操作以完成请求

4xx 请求资源不存在,客户端错误,请求包含语法错误或无法完成请求

5xx 服务器错误

HTTP状态码列表:

 

100Continue继续。客户端应继续其请求
101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
 
200OK请求成功。一般用于GET与POST请求
201Created已创建。成功请求并创建了新的资源
202Accepted已接受。已经接受请求,但未处理完成
203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206Partial Content部分内容。服务器成功处理了部分GET请求
 
300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303See Other查看其它地址。与301类似。使用GET和POST请求查看
304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305Use Proxy使用代理。所请求的资源必须通过代理访问
306Unused已经被废弃的HTTP状态码
307Temporary Redirect临时重定向。与302类似。使用GET请求重定向
 
400Bad Request客户端请求的语法错误,服务器无法理解
401Unauthorized请求要求用户的身份认证
402Payment Required保留,将来使用
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405Method Not Allowed客户端请求中的方法被禁止
406Not Acceptable服务器无法根据客户端请求的内容特性完成请求
407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408Request Time-out服务器等待客户端发送的请求时间过长,超时
409Conflict服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410Gone客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息
412Precondition Failed客户端请求信息的先决条件错误
413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理
415Unsupported Media Type服务器无法处理请求附带的媒体格式
416Requested range not satisfiable客户端请求的范围无效
417Expectation Failed服务器无法满足Expect的请求头信息
 
500Internal Server Error服务器内部错误,无法完成请求
501Not Implemented服务器不支持请求的功能,无法完成请求
502Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
505HTTP Version not supported服务器不支持请求的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(b'HTTP/1.1 200 ok\r\n\r\n')
    print(data)
    # 手动处理http数据获取用户访问的路径
    """
b'GET /index HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n\r\n'
    """
    current_path = data.decode('utf-8').split('\r\n')[0].split(' ')[1]
    if current_path == '/index':
        # conn.send(b'index')
        with open('index.html', 'rb')as f:
            conn.send(f.read())
    else:
        conn.send(b'404')
    conn.close()

# 动静态网页

静态网页:页面上的数据是写死的。

动态网页:页面上的数据从后端动态获取。比如后端获取当前时间,获取数据库数据传递给前端。

# 基于wsgiref模拟框架

from wsgiref.simple_server import make_server
from urls import *




def run(env,response):
    """
    :param env: 请求相关的信息
    :param response: 响应相关的信息
    :return:
    """
    print(env)  # 是一个大字典 里面装了一堆处理好了的键值对数据
    response('200 OK',[('username','jason'),('password','123')])  # 固定写法 后面列表里面一个个元祖会以响应头kv键值对的形式返回给客户端
    # 获取用户访问的路径
    current_path = env.get('PATH_INFO')
    # if current_path == '/index':
    #     return [b'index']
    # elif current_path == '/login':
    #     return [b'login']
    # 定义一个存储函数名的变量名
    func = None
    # 循环比对路由与试图函数的映射关系
    for url_map in urls:  # url_map = ('/index',index)
        if current_path == url_map[0]:
            func = url_map[1]
            # 只要匹配成功 直接结束循环
            break
    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)
    server.serve_forever()

# 模板渲染

后端生成的数据直接传递给前端页面使用(并且前端页面可以灵活的操作改数据) >>> 模板语法
    
    模板渲染 模板语法需要依赖于第三方模块
    pip install jinja2
    

    模板语法  jinja2支持前端直接使用类似于python的语法操作数据
    

<p>{{ user_dic }}</p>
    <p>{{ user_dic.name }}</p>
    <p>{{ user_dic['password'] }}</p>
    <p>{{ user_dic.get('name') }}</p>
    
    {% for user in user_dict %}  <!--[{},{},{},{}]-->
        <tr>
            <td>{{ user.id }}</td>
            <td>{{ user.name }}</td>
            <td>{{ user.password }}</td>
        </tr>
    {% endfor %}

# 简易web请求流程图

 # python三大主流web框架

    Django:大而全,自带了很多功能模块,类似于航空母舰 (缺点:有点笨重)
    Flask:短小精悍,自带的功能模块特别少,大部分都是依赖于第三方模块(小而轻)
    Tornado:异步非阻塞 主要用在处理高io 多路复用的情况 可以写游戏后端

Django:
    a用的别人的 wsgiref
    b自己写的
    c自己写的
Flask:
    a用的别人的 werkzeug
    b自己写的
    c用的别人的 jinja2
Tornado:
    a,b,c都是自己写的

# Django简介

创建django注意事项:

    1.计算机的名称不能有中文
    2.一个pycharm窗口就是一个项目,不要多个项目放在一个窗口里面
    3.项目名不能起中文

# Django简介

版本问题

djang下载
    推荐下载1.11.11版本
    命令行直接下载
        pip install django==1.11.11
    pycharm下载
    
    验证是否下载成功
    django-admin

如何创建一个django项目?

方式1(命令行创建):
            创建django项目
                django-admin startproject 项目名
            创建app应用
                python3 manage.py startapp app01
            启动django项目
                python3 manage.py runserver 
            ps:用命令行创建django默认不会自动创建templates文件夹
            需要你手动自己创建(注意改文件夹路径是否被添加配置文件中)
            

方式2(pycharm创建)
            FILE >>> new project 选择第二个django 需要注意名字不能有中文,选择本地的解释器,勾选后台管理
            创建app
                pycharm命令行创建
                    python3 manage.py startapp app01
                Tools下面run manage task功能栏
            启动点小绿色箭头
            

强调:
            1.用django一定要保证只有一个在运行状态  切记切记!!!!!!!
            2.一定记得清浏览器的缓存

# 什么是app(应用)?

一个django项目就是一所大学,app就是大学里面的学院。

注意新创建的app需要在配置文件中注册才能生效:

django中添加app:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
	'app01.apps.App01Config'  # 可以用全称
	'app01' 				 # 也可以简写
]

# django各个文件夹的作用

应用名:
    migrations  数据库迁移记录相关数据
    admin.py       django后台管理相关
    models.py   模型表相关
    views.py       视图函数相关

项目名:
    settings.py  配置文件
    urls.py        路由与视图函数的映射关系

templates
    项目用到的所有的html文件

manage.py 
    django入口文件

# django小白必会三板斧

from django.shortcuts import render,HttpResponse,redirect

HttpResponse  返回字符串

render        返回一个html页面

两种给前端页面传值的方式
		def reg(request):
			user_dict = {'name':'jason','password':'123'}
			return render(request,'reg.html',{'user_dict':user_dict})
		
		def reg(request):
			user_dict = {'name':'jason','password':'123'}
			return render(request,'reg.html',locals())

第一种方式要比第二种方式在某些情况下要快一点

 

redirect      重定向

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值