【Django框架】第01回 Django简介

1.Wed框架

1.1 Wed框架本质

web框架本质上可以看成是一个功能强大的socket服务端,用户的浏览器可以看成是拥有可视化界面的socket客户端。两者通过网络请求实现数据交互,学者们也可以从架构层面上先简单的将Web框架看做是对前端、数据库的全方位整合

1.2 纯手撸Wed框架

代码实现

import socket

server = socket.socket()  # TCP协议
server.bind(('127.0.0.1', 8080))  # IP协议 PORT协议
server.listen(5)  # 连接池

while True:
    sock, address = server.accept()
    data = sock.recv(1024)
    sock.send(b'HTTP/1.1 200 ok\r\n\r\n')
    # print(data.decode('utf8'))  # 从字符串中截取出需要的内容
    target_url = data.decode('utf8').split(' ')[1]   # /index /login /reg /xxx
    if target_url == '/index':
       sock.send(b'index view')
    elif target_url == '/login':
       sock.send(b'login view')
    elif target_url == '/reg':
       sock.send(b'reg view')
    else:
       sock.send(b'404 error')


代码步骤

1.socket服务端代码
2.HTTP协议
3.根据网址后缀的不同请求不同的内容
4.请求方式 
  GET 朝服务端索要数据
  POST 朝服务端提交数据
5.从请求数据式中筛选出用户输入的网址后缀、
  target_url = data.decode('utf8').split(' ')[1]
6.代码的缺陷
  1.socket代码重复编写造轮子
  2.针对请求数据格式的处理复杂且重复
  3.针对不同网址后缀的匹配方式过于繁琐基础

页面导入

 if target_url == '/index':
    # sock.send(b'index view')
    with open(r'myhtml.html','rb') as f:
        sock.send(f.read())

2.基于wsgiref模块编写

# wsgiref内部封装了socket代码和对请求数据的处理
from wsgiref.simple_server import make_server


def run(request,response):
    """
    :param request:  请求数据
    :param response:  响应数据
    :return:  返回给客户端的数据
    """
    print(request)
    response('200 OK', [])  # 固定代码  无需掌握
    return [b'hello wsgiref']


if __name__ == '__main__':
    server = make_server('127.0.0.1', 8080, run)  # 任何访问127.0.0.1:8080的请求都会自动调用run处理(会给第三个参数加括号调用)
    server.serve_forever()  # 永久启动

代码优化1 封装函数

1.wsgiref模块解决了两个问题
   1.socket代码重复编写造轮子
   2.针对请求数据格式的处理复杂且重复
2.思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)
   1.先从大字典中查找出记录网址后缀的键值对( 'PATH_INFO': '/index')
   2.不推荐使用连续的多个if判断
     if target_path == '/index':
         return [b'index']
     elif target_path == '/login':
         return [b'login']
     else:
         return [b'404 not found!'] 
   3.针对面条版的代码首先应该考虑封装成函数
      from wsgiref.simple_server import make_server
      def index(request):
          return 'index'
      def login(request):
          return 'login'
      def error(request):
          return '404 error'

      urls = (
          ('/index',index),
          ('/login',login),
      )
      def run(request,response):
          """
          :param request:  请求数据
          :param response:  响应数据
          :return:  返回给客户端的数据
          """
          response('200 OK', [])  # 固定代码  无需掌握
          # print(request)  # 自动将请求数据全部处理成字典k:V键值对形式
          target_path = request.get('PATH_INFO')
          # if target_path == '/index':
          #     return [b'index']
          # elif target_path == '/login':
          #     return [b'login']
          # else:
          #     return [b'404 not found!']
          func_name = None
          for url_tuple in urls:
              if url_tuple[0] == target_path:
                  func_name = url_tuple[1]  # 先存储匹配到的函数名
                  break  # 匹配到了内容就立即结束for循环,没有必要继续往下核验了
          # for循环结束之后还需要判断func_name是不是为None (有可能没有匹配上)
          if func_name:
              res = func_name(request)
          else:
              res = error(request)
          return [res.encode('utf8')]  # 做统一的编码处理 这样函数就只需要返回字符串即可,操作更简单


      if __name__ == '__main__':
          server = make_server('127.0.0.1', 8080, run)  # 任何访问127.0.0.1:8080的请求都会自动调用run处理(会给第三个参数加括号调用)
          server.serve_forever()  # 永久启动

代码优化2 模块化

根据py文件中功能的不同划分到不同的py文件(模块化)
urls.py	 	   对应关系
views.py 	   功能函数
start.py           启动文件
templates文件夹     存储html

3 动静态网页

1. 动态网页
      页面上的数据不是全部写死的 有些是动态获取(后端传入)
2. 静态网页
      页面上的数据直接写死的 要想改变只能修改源码
3. 实际需求
   后端代码回去当前时间 然后让前端页面展示
       1.字符串替换
       2.将字典数据传递给html页面并且想要在页面上操作字典数据
       3.我们无法自己实现>>>:在html页面上使用类似于后端的语法操作数据
def get_time(request):
    import time
    ctime = time.strftime('%Y-%m-%d  %H:%M:%S')
    with open(r'templates/myhtml03.html','r',encoding='utf8') as f:
        data = f.read()
    # 如何将时间嵌入到html文件数据内,之后在返回给前端浏览器(字符串替换)
    data = data.replace('heiheihei',ctime)
    return data

3.1 jinja2模块

jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型
from jinja2 import Template
def get_dict(request):
    user_dict = {'name': 'jason', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
    with open(r'templates/myhtml04.html', 'r', encoding='utf8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(data=user_dict)  # 将字典传递给html页面 页面上通过data即可获取(data仅仅是一个变量名)
    return res

3.2 模板语法

import pymysql
def get_mysql(request):
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='day55',
        charset='utf8',
        autocommit=True
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'select * from userinfo'
    cursor.execute(sql)
    user_data = cursor.fetchall()  # [{},{},{}]
    with open('templates/myhtml05.html','r',encoding='utf8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(user_data=user_data)
    return res


<body>
   <div class="container">
       <div class="row">
           <h1 class="text-center">数据展示</h1>
           <div calss="col-md-6 col-md-offset-3">
               <table class="table table-hover table-striped">
                   <thead>
                      <tr>
                          <th>主键</th>
                          <th>姓名</th>
                          <th>年龄</th>
                      </tr>
                   </thead>
                   <tbody>
                       {% for user in user_data %}
                         <tr>
                             <td>{{ user.id }}</td>
                             <td>{{ user.name }}</td>
                             <td>{{ user.age }}</td>
                         </tr>
                       {% endfor %}
                   </tbody>
               </table>
           </div>

       </div>
   </div>
</body>

4 python主流Wed框架

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

5 Django框架简介

1.版本问题(使用什么版本都可以 区别不大 先用2.2)
   1.X:同步    1.11
   2.X:同步    2.2   
   3.X:异步    3.2
2.启动注意事项
  1.计算机名称尽量不要有中文
  2.项目中所有的py文件名尽量不要用中文
  3.不同版本的python解释器配合不同版本的django 会有一些报错,仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错,找到那一行代码 把逗号删除即可(widgets.py 152)
  4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套
3.安装验证django是否下载成功
  1.python38 -m pip install --upgrade pip升级pip
  2.pip3.8 install django==2.2.22安装djangio 2.2.22版本
  3.在cmd终端输入django-admin,验证django是否下载成功**


6 Django基本操作命令

6.1 命令行启动Django项目

1.创建Django项目

Django-admin startproject 项目名

2.启动django项目

1.先切换到项目目录下
  cd 项目名
2.执行启动目录
  python38 manage.py runserver ip:port

3.访问django服务端,浏览器直接访问

4.创建app应用

1.django框架类似于是一个空壳子 给你提供所需的资源,至于到底要写哪些功能,需要通过创建app来划分  
  eg:django初始项目可以看成是一所大学,app就相当于是大学里面的各个学院
2.python38 manage.py startapp 应用名

5.注意事项

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

6.2 pycharm操作



6.3 命令行与pycharm操作的区别

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


7 Django目录结构

项目同名文件夹
    __init__.py      很少有,主要做一些冷门配置
    settings.py      项目配置文件
    urls.py	     对应关系(目前简单的理解:网址后缀跟函数名)
    wsgi.py	     django服务 基本不用
    manage.py	     django入口文件(启动脚本)
    templates文件     存储项目所需的html文件

应用名文件夹(可以有多个)
    migrations文件夹  orm相关(数据库打交道的记录)
    __init__.py       很少用 主要做一些冷门配置
    admin.py	      django自带的后台管理
    apps.py	      创建应用之后用于应用的注册
    models.py	      存储与数据库表相关的类
    tests.py	      自带的测试文件
    views.py	      存储业务相关的逻辑代码(函数、类)
    db.sqlite3	      自带的小型数据库

专业名字
    urls.py	路由层(对应关系,引导怎么走)
    views.py	视图层(核心逻辑层)
    templates	模板层(存储html文件)
    models.py   模型层(专门存表)

8 django小白必会三板斧

HttpResponse主要用于直接返回字符串类型的数据

render主要用于返回html页面 并且支持模板语法

redirect主要用于页面重定向

posted @ 2022-08-30 23:18  |相得益张|  阅读(41)  评论(0编辑  收藏  举报