今日内容 web框架的建立流程 djiango框架简介和使用

  • 纯手写web框架

web框架可以简单的理解为是基于互联网的web服务端 >>>:socket服务端

1.socket服务端代码

2.HTTP协议

3.根据网址后缀的不同请求不同的内容

4.请求方式    GET    朝服务端索要数据

                      POST   朝服务端提交数据

5.从请求数据格式中筛选 出用户输入的网址后缀

target_url = data.decode('utf8').split(' ')[1]

6.代码的缺陷

      1.socket代码重复编写造轮子

      2.针对 请求数据格式的处理复杂且重复

      3.针对不同网址后缀的匹配方式过于LOWB

复制代码
import socket


server = socket.socket()   # TCP协议
server.bind(('127.0.0.1',8080))   # IP协议  POST协议 
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 = dara.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')
复制代码
  • 基于wsgiref模块写

复制代码
wsgiref内部封装了socket代码和对请求数据的处理

from wsgiref.simple_server import make_server


def run(request, response):
    """
    :param request: 请求数据
    :param response: 响应数据
    :return: 返回给客户端的数据
    """
    print(request)  # 自动将请求数据全部处理成字典k:v键值对形式
    response('200 OK', [])  # 固定代码 无需掌握
    return [b'hello big baby']


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

1.wsgiref模块解决了两个问题
                  socket代码重复编写造轮子
                  针对请求数据格式的处理复杂且重复

2.思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)
先从大字典中查找出记录网址后缀的键值对
             1.不推荐使用连续的多个if判断
             2.针对面条版的代码首先应该考虑封装成函数

复制代码
def index(request):
            return 'index'
        def login(request):
            return 'login'
        def register(request):
            return 'register'
        def error(request):
            return '404 error'
        urls = (
            ('/index', index),
            ('/login', login),
            ('/register', register),
         )    
复制代码

3.根据py文件中功能的不同划分到不同的py文件(模块化)

    urls.py              对应关系
    views.py             功能函数
    start.py             启动文件
    templates文件夹       存储html
  • jinja2模块

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


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
复制代码
  • 模板语法

复制代码
<h1>{{ data }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('pwd') }}</h1>
<h1>{{ data.hobby }}</h1> 

{% for user in user_data %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <td>{{ user.age }}</td>
    </tr>
{% endfor %}
复制代码
  • python主流web框架

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

 

  • django框架简介

一.版本

django目前一共有三个版本 1.1  2.2   3.2  无论使用 什么版本都可以  区别并不大

二.启动注意事项

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

  • django基本操作命令

一.命令行创建操作

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

二.命令行创建与pycharm操作的区别

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

复制代码
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   模板层
models.py   模型层
复制代码
  • django三板斧

一.HttpResponse  

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

1)Django服务器接收到客户端发送过来的请求后,会将提交上来的数据封装成httpRequest对象传给视图函数。那么视图处理完相关逻辑后,也需要返回一个响应给浏览器。而这个响应必须返回HttpResponseBase或者他的子类的对象
2)可以使用django.http.HttpResponse来构造响应对象
3) HttpRequest对象由Django创建,HttpResponse对象或子对象由开发人员创建。

二.render

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

这里的func.html在Django中称作Template(模板文件),使用render方法将第三个参数中的值替换Template中的指定模板参数,最终返回一个正常的HTML页面。

三.redirect

主要用于页面重定向

在开发中,我们经常会遇到一种需求,当某个逻辑操作完成后,将用户引导到另外一个逻辑、页面中
如图自动跳转到百度页面

posted @   你好你好你好丶  阅读(141)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示