django框架01 前期推到导与简介

165 阅读6分钟

wed框架推导(django框架前戏)

  • 1.wed框架的简单理解
    • 基于互联网的wed服务端(socket服务端)
  • 2.web框架的一些知识
    • 1.socket服务端代码
    • 2.HTTP协议 >>>:四大特性
  • 3.根据路由的不同请求不同的内容
    • 路由:web开发中路由指的是根据url分配到对应的处理程序。
  • 4.请求方式
      get          朝服务端索要数据
      post         朝服务端提交数据
    
  • 5.从请求数据中筛选出用户输入的路由
      target_url = data.decode('utf8').split(' ')[1]
    
  • 6.代码的缺陷
    • 1.socket代码重复编写造轮子
    • 2.针对请求数据格式的处理复杂且重复
    • 3.针对不同路由的匹配方式过于low
  • 7.代码
     import socket
    
     server = socket.socket()
     server.bind(('127.0.0.1',8080))
     server.listen(5)
    
     while True:
         sock, address = server.accept()
         data = sock.recv(1024)
         sock.send(b'HTTP/1.1 200 OK\r\n\r\nhello this is my wed')
         target_url = data.decode('utf8').split(' ')[1]
         if target_url == '/index':
             sock.send(b'index view')
         elif target_url == '/login':
             sock.send(b'login view')
         else:
             sock.send(b'404 error')
    
    

基于wsgiref模块解决web推导的缺陷

  • 1.wsgiref模块介绍
    • wsgiref模块内部封装了socket代码与对请求数据的处理
  • 2.如何解决socket代码重复编写
    • 导入wsdiref模块
      from wsgiref.simple_server import make_server 
      
  • 3.针对请求数据格式的处理复杂且重复
    • 将其封装为函数功能
      • 代码
      from wsgiref.simple_server import make_server
      
      def run(request, response):
          """
          :param request:  请求数据
          :param response: 响应数据
          :return: 返回给客户端的数据
          """
          print(request)
          response('200 OK', [])   # 固定代码无需掌握
          return [b'hello big baby']
      
      if __name__ == '__main__':
          # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
          server = make_server('127.0.0.1', 8080, run)  
          server.serve_forever()     # 永久启动
      
      
  • 4.wsgiref模块解决我们的前两个遇到的问题
    但是现在得到的结果,如果后续添加新的网页。是十分不便于管理的,所以需要进行代码封装优化,按照软件开发目录规范进行分类管理
    
    • 代码
      * 1.面条版代码优化:
      
      from wsgiref.simple_server import make_server
      
      def index(request):
          return 'index'
      def login(request):
          return 'login'
      def error(request):
          return '404 not found'
      
      urls = (
          ('/index',index),
          ('/login',login),
      )
      def run(request, response):
          """
          :param request:  请求数据
          :param response: 响应数据
          :return: 返回给客户端的数据
          """
          response('200 OK', [])  # 固定代码无需掌握
          target_path = request.get('PATH_INFO')
      
          func_name = None
          for url_tp in urls:   #   ('/index',index),
              if url_tp[0] == target_path:
                  func_name = url_tp[1]    # 存储匹配到的函数吗,方便后续调用
                  break    # 一旦匹配到内容直接结束for循环
          # for循环结束后需要判断func_name是否还为空,
          if func_name:
              res = func_name(request)
          else:
              res = error(request)
          return [res.encode('utf8')]    # 统一编码处理,函数返回字符串操作更简单
      
      if __name__ == '__main__':
          # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
          server = make_server('127.0.0.1', 8080, run)
          server.serve_forever()     # 永久启动
       
      * 2.软件开发目录规范分类管理
          根据py文件中功能的不同划分到不同的py文件(模块化)
          urls.py	 		 对应关系
          views.py 		 功能函数
          start.py 		 启动文件
          templates文件夹  存储html
      

动静态网页

  • 1.动态网页
    • 页面上的数据是动态获取的,也就是通过后端传入,例如用户注册登录账户密码的获取
  • 2.静态网页
    • 直接写死的数据,修改源码才能修改数据,前端所写的页面展示出来的就是静态网页
  • 3.需求实现
    通过后端代码实现让前端页面展示后端所写的东西
      1.可以通过文件读写,然后在前端设置字符串,然后后端把字符安串替换掉的方式实现。
      2.但是如果想要实现字典数据传递给html页面并且想要在页面上操作字典数据。我们自己如果不借助第三方模块是实现不了的。
    

jinja2模块

jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型

  • 1.jinja2的下载
    pip38 install jinja2
    
  • 2.jinja2实现后端字典数据传递给前端,且拿到其中一个键或值
    • 导入jinja2模块
    from jinja2 import Template
    
    • 代码实现
      from jinja2 import Template
      def get_dict(request):
          user_dict = {'id': 1, 'name': 'tom', 'age': 18, 'hobby': ['ring', 'run']}
          with open(r'templates/my01.html','r',encoding='utf8') as f:
              data = f.read()
          temp =Template(data)
          res = temp.render(data=user_dict) # 将字典传递给html页面,页面通过data就能获取
          return res
    html内的:
        <p>{{ data }}}</p>
    
  • 3.jinja2模板语法
    • 前端操作后端,前端语法模板
    1.字典取值(四种方式)
    <h1>{{ data }}</h1>
    <h1>{{ data['name'] }}</h1>
    <h1>{{ data.get('pwd') }}</h1>
    <h1>{{ data.hobby }}</h1> 
    
    2.数据库表单展示
    {% for user in user_data %}
      <tr>
          <td>{{ user.id }}</td>
          <td>{{ user.name }}</td>
          <td>{{ user.age }}</td>
      </tr>
    {% endfor %}
    

python的框架介绍

  • 1.django框架
    大而全 自身携带的功能非常的多
    缺陷:开发小项目的时候使用该框架有点笨重(大材小用)
    
  • 2.flask框架
    小而精,自身携带的功能非常的少,依赖于第三方模块
    缺陷:受限于第三方模块的开发
    
  • 3.tornado框架
    异步非阻塞框架 该框架快到可以作为游戏服务器
    缺陷:上手难度是三者最高的
    
  • 4.fastapi框架、sanic框架、...
    最近流行的
    

django框架介绍

  • 版本问题
      1.X:同步		1.11
      2.X:同步		2.2
      3.X:异步		3.2
    

无论使用什么版本都可以 区别不大

  • 启动注意事项
    • 1.计算机名称尽量不要有中文
    • 2.项目中所有的py文件名尽量不要用中文
    • 3.不同版本的python解释器配合不同版本的django,会有一些报错
    仔细查找一下报错信息,里面会提示你是哪个py文件里面的代码出错,找到那一行代码,把逗号删除即可
    
    • 4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套

django基本操作命令

  • 1.验证django是否下载成功
    cmd终端输入django-admin
    
  • 2.cmd命令操作
    1.创建django项目
      	django-admin startproject 项目名
    2.启动django项目
      1.先切换到项目目录下        cd 项目名
      2.执行启动目录             python38 manage.py runserver ip:port
          #  ip:port 本机可不写
      3.访问django服务端
      	浏览器直接访问 	
      4.创建app应用
          python38 manage.py startapp 应用名
      	"""
      	django框架类似于是一个空壳子 给你提供所需的资源
      	至于到底要写哪些功能 需要通过创建app来划分
      		eg:django初始项目可以看成是一所大学
      		   app就相当于是大学里面的各个学院
      	"""     
    
  • 3.pycharm操作 new project>>>django(鼠标控制)

在启动django项目的时候,一定要确保一个端口只有一个项目。

  • 命令行与pycharm操作的区别
    • 1.命令行不会自动创建templates文件夹
    • 2.命令行不会在配置文件编写关于templates文件夹的配置
      'DIRS': [os.path.join(BASE_DIR, 'templates')]
      
    • 3.pycharm自动创建的第一个应用会自动注册到配置文件中
    • 4.针对db.sqlite3文件不用去在乎它有没有创建 只要运行了django会自动出来

django目录文件介绍

  • django项目目录
    1. 项目同名文件夹
          2. __init__.py              很少用 主要做一些冷门配置
          3. settings.py              项目配置文件
          4. urls.py                  对应关系(目前简单的理解:网址后缀跟函数名)
          5. wsgi.py                  django服务 基本不用
          6. manage.py                django入口文件
    7. templates文件夹		  存储项目所需的html文件
    8. 应用名文件夹(可以有多个)
          9. migrations文件夹         orm相关(数据库打交道的记录)
          10.__init__.py              很少用主要做一些冷门配置
          11.admin.py                 django自带的后台管理
          12.apps.py                  创建应用之后用于应用的注册
          13.models.py                存储与数据库表相关的类
          14.tests.py                 自带的测试文件
          15.views.py                 存储业务相关的逻辑代码(函数、类)
    16.db.sqlite3                     自带的小型数据库
    
  • 重要知识
    urls.py           路由层
    views.py          视图层
    templates         模板层
    models.py         模型层
    
导入方式:
from django.template import Template, TemplateDoesNotExist  
           # django一般会自己创建该模块,建议缺什么补什么
  • 使用django连接数据库导出数据库表
    image.png