Django

  • 纯手撸web框架
  • 基于wsgiref模块
  • 动静态网页
  • 基于jinja2模板语法
  • 前端、框架、数据库三者结合使用
  • python主流web框架
  • django框架简介
    ps:注重逻辑思维的理解,推导过程中的代码无需掌握

手写web框架

# 什么是web框架?
	将前端、数据库整合到一起基于互联网传输的python代码
    web框架也可以简单理解为是软件开发架构里面的服务端
    
# 1.搭建简易版本服务端
	socket模块
# 2.遵循HTTP协议
	四大特性、数据格式、响应状态码
# 3.基于不同的后缀响应不同的内容
	如何获取用户输入的url后缀>>>:HTTP请求数据
    /favicon.ico直接忽略 不影响判断
  利用字符串切割和索引取值获取相应数据

# 手撸简易web框架
import socket

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

while True:
    sock,addr = server.accept()
    data = sock.recv(1024)
    print(data)
    # 获取请求的位置文本
    request_path = data.decode('utf8').split(' ')[1]
    print(request_path)  # /login
    # 判断用户想请求什么,就给他返回什么
    if request_path == 'login':
        sock.send(b'login')
    elif request_path == 'register':
        sock.send(b'register')
    else:
        sock.send(b'404 error')
       
'''
上述框架缺陷:
	1.服务端起始代码重复太多
	2.没有针对HTTP请求数据的完善处理方式
	3.无法并发
'''

基于wsgiref模块

from wsgiref import simple_server

def run(request,response):
    """
    :param request: 请求相关的数据
    :param response: 响应相关的数据
    :return: 返回给客户端的展示数据
    """
    print(request)  # 结果是一个字典,存储了请求的所有数据
    response('200 OK', [])  # 固定编写 无需掌握
    request_path = request.get("PATH_INFO")  # 存储请求文本的名字是PATH_INFO
    # 判断用户请求哪个位置就给他啥
    if request_path == 'login':
        return ['login']
    elif request_path == 'register':
        return ['register']
    else:
        return ['404 error']

if __name__ == '__main__':
    server = simple_server.make_server('127.0.0.1',8080,run)
    '''一致监听本机8080端口 一旦有请求访问 自动触发run方法的执行'''
    server.serve_forever()

优化思路

# 问题
    1.后续页面变多,继续写elif不现实
    2.每个if下面的功能肯定不止这么点,代码会非常长
    
# 解决
    1.封装成函数,使用类似于功能元组,让系统根据用户传来的文本匹配功能方法
    2.拆分成功能模块,以减少单个py文件的代码量
  
# 常见文件及作用
    urls.py			对应关系的存储
    views.py			业务逻辑的编写
    templates文件夹		存储HTML文件
    static文件夹			存放项目所需'静态文件'
# 这样拆分后,后续想加功能,就可以在templates文件夹里加一个页面,urls.py里面加一个功能元组,views.py里面加功能,即可实现新加功能,方便维护管理

eg:
    from wsgiref import simple_server


    def login(request):
        return 'login'


    def register(request):
        return 'register'


    def error(request):
        return '404 error'

    # 加载HTML界面
    def index(request):
        with open('templates/output.html', 'r', encoding='utf8') as f:
            return f.read()

    urls = (
        ('/login', login),
        ('/register', register),
        ('/index', index)
    )


    def run(request, response):
        """
        :param request: 请求相关的数据
        :param response: 响应相关的数据
        :return: 返回给客户端的展示数据
        """
        print(request)  # 结果是一个字典,存储了请求的所有数据
        response('200 OK', [])  # 固定编写 无需掌握
        request_path = request.get("PATH_INFO")  # 存储请求文本的名字是PATH_INFO
        # 判断用户请求哪个位置就给他啥
        for i in urls:
            if request_path == i[0]:
                func_name = i[1]
                break
        if func_name:
            res = func_name(request)
            return [res.encode('utf8')]
        else:
            return [error().encode('utf8')]


    if __name__ == '__main__':
        server = simple_server.make_server('127.0.0.1', 8080, run)
        server.serve_forever()

        
        
'''
上述代码是封装成函数的版本
我们可以把函数放到单独的py文件里,在通过模块调用即可
'''

动静态网页

# 静态网页
	页面数据不会变化,想要改变必须用过源码
    eg:类似于写死的字符串
# 动态网页
	页面数据可以通过代码实时改变
    eg:类似于先用占位符占着的字符串,后面再通过替换把数据放上去

# 动态页面实例
	
# 用户输入模拟后台获取数据
data = input('>>>').strip()
def get_data():
    # 读取HTML文件
    with open('templates/output.html', 'r', encoding='utf8') as f:
        html_data = f.read()
        # 把值写入到HTML中
        new_data = html_data.replace('aaaaa',data)
        return new_data  # 返回新的值

jinjia2模块

# 这是一个第三方模块,需要下载使用
	pip3 install jinja2
    
# 功能介绍
	jinja2提供了模板语法,可以在HTML页面使用类似于后端的代码操作数据
    temp_obj.render({'user':user_dict})
 
<table>
    <thead>
        <th>编号</th>
        <th>姓名</th>
        <th>密码</th>
        <th>操作</th>
    </thead>
    <tbody>
        {$ for i in user_dict$}
        <td>{{ i.user_id }}</td>
        <td>{{ i.username }}</td>
        <td>
            <a href="">修改</a>
            <a href="">删除</a>
        </td>
        {$end for$}
    </tbody>
</table>

框架请求流程

urls.py
	后缀与函数名对应关系
  ('/index',register)
  	后缀专业名词称之为'路由'
    函数名专业名词称之为'视图函数'
    urls.py专业名词称之为'路由层'

views.py
	专门编写业务逻辑代码
  	可以是函数 也可以是类
    	函数专业名词称之为'视图函数'
    	类专业名词称之为'视图类'
      views.py专业名词称之为'视图层'

templates文件夹
	专门存储html文件
  	html文件专业名词称之为'模板文件'
    templates文件夹专业名词称之为'模板层'

python主流web框架

django
	大而全 自带的功能非常的多 但是有时候会略显笨重
  类似于'航空母舰'
  
flask
	小而精 自带的功能非常的少 但是第三方模块非常的多
  类似于'游骑兵'
  # flask的第三方模块加到一起甚至比django还多 并且也越来越像django
  # flask由于过多的依赖于第三方模块 有时候也会受制于第三方模块
  
tornado
	异步非阻塞框架 速度极快 甚至可以用于充当游戏服务器

# 还有一些占比较小  但是也很厉害的框架
	fastapi、sanic......
  
"""
框架的核心逻辑几乎是一致的 我们在学习的时候只需要先学会一种
之后就可以触类旁通 但是需要强调的是:千万不用同时学习!!!
"""

django框架简介

# 版本问题
  django3.X:默认支持异步功能
  django2.X:默认不支持异步
  django1.X:默认不支持异步
	'''
	我们学习的时候 可以基于django1.11.X版本 与2.X功能几乎一致
	3.X仅仅是多了一个功能(并且该功能目前还不完善 半成品!!!)
	'''
  django1.11.X LTS 2018年发布
  django2.2.X	 LTS 2020年发布
  # 之前使用的是1.11 有些新项目逐步过渡到2.2 自己私下也研究过3.2

# 启动问题
	django启动可能报错的原因
    1.计算机名称不能含有中文
    	直接修改即可
    2.不同版本的解释器可能会报错
    	找到报错信息的最后一行提示对应的代码 删除源文件逗号即可
      	eg: 解释器推荐使用python3.6 几乎不会报错
      		解释器如果是高版本使用django1.11可能会报错
            解释器如果是低版本使用django2、3也可以报错
    3.项目中所有的文件名称最好使用英文
    4.一个pycharm窗口尽量就是一个完整的项目 不要嵌套
   
# 下载
	pip3 install django==1.11.11
  '''如果之前下载了其他版本不用管 自动替换!!!'''

django基本使用


# 验证是否下载成功
	cmd窗口直接输入django-admin有反应就是成功了
# 命令操作django
  1.创建django项目
  	django-admin startproject 项目名(mysite)
  2.启动django项目
  	cd 项目名(mysite)
    python3 manage.py runserver IP:PORT
  3.创建app应用
  	python3 manage.py startapp 应用名(app01)
    '''命令行无法自动创建模板文件夹 需要自己执行命令创建'''
# pycharm操作django
  1.new project
  	选择django 填写应用即可
    '''pycharm默认会自动帮你创建模板文件夹 并提供创建一个app的功能'''
  2.创建更多的app
  	tools
    	run manage.py task 命令自动提示
  3.启动项目
  	直接点击绿色箭头 
    	还可以修改端口号 edit configurations

应用app

django本身类似于是一个空壳子 真正的功能是由里面的各个应用决定

django框架相当于是一所大学 应用相当于是大学里面的各个学院
	大学其实是个壳子 负责提供环境 
  学院才是一个个真正具备特定功能的集合

eg:
  使用django写一个淘宝
  	淘宝里面有很多功能模块
    	我们应该先创建一个空的django项目然后根据功能的不同创建不同的应用
      	django项目
          app01(user)
          app02(order)
          app03(goods)
          app04(backend)

django主要文件介绍

djangoProject项目文件名
	djangoProject同名文件夹
    # settings.py		项目配置文件
    # urls.py			路由层
  manage.py
  	django入口文件 很多命令都需要该文件支持
  db.sqlite3
  	django启动之后才会生成的文件 其实就是django自带的小型数据库
  templates文件夹
  	模板层
  main应用文件夹
    # migrations文件夹			数据迁移记录(后续讲解)
    # admin.py				django自带的后台管理(后续讲解)
    # apps.py				用于app的注册(后续讲解)
    # models.py				专门用于操作数据库(后续讲解 很重要)
    # views.py				视图层
  
"""
创建应用之后 一定要去配置文件中注册才能生效
	'mian.apps.App01Config'  完整语法
	'mian'			 简写语法
"""

posted @ 2022-05-10 22:40  Yietong  阅读(63)  评论(0)    收藏  举报