Day55 web框架 入门 Django

Day55 web框架 入门 Django

1、纯手撸web框架

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

TCP服务端

import socket

server=socket.socket()

server.bind(('127.0.0.1',8080))

server.listen(3)
while True:
    sock,address=server.accept()

    sock.send(bytes('hello','utf8'))
    res=sock.recv(1024)

基于TCP协议 HTTP协议服务端

import socket

server=socket.socket()

server.bind(('127.0.0.1',8080))

server.listen(3)
while True:
    sock,address=server.accept()

    sock.send(bytes(b'HTTP/1.1 200 OK\r\n\r\nhello','utf8'))
    res=sock.recv(1024)

推导 通过 网址不同请求不同的内容

  • GET
    • 朝服务端索要数据
  • POST
    • 朝服务端提交数据

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

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

代码的缺陷

  1. socket代码重复编写
  2. 针对请求数据格式的处理复杂且重复
  3. 针对不同网址后缀的匹配方式过去lowB
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\n')
    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')
    elif target_url =='/reg':
        sock.send(b'reg view')
    else:
        sock.send(b'404 reeor')

2、基于wsgiref

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

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

from wsgiref.simple_server import make_server


def run(request, response):
    """
    :param request: 请求数据
    :param response: 响应数据
    :return: 返回客户端数据
    """
    print(request)  # Zion给将 请求数据全部处理成字典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. 不推荐使用if判断
  2. 针对面条版的代码首先应该考虑封装成函数
def index(reuest):
    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),
)

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

文件名功能
urls.py对应关系
views.py功能函数
start.py启动文件
templates存储html

2.1、动静态网页

动态网页
页面上的数据不是全部写死的 有些是动态获取(后端传入)

静态网页
页面上的数据直接写死的 要想改变只能修改源码

2.2、新需求

后端代码获取当前时间 然后让前端页面展示

  1. 字符串替换

  2. 将字典数据传递给html页面并且想要在页面上操作字典数据

    我们之前所学 无法自己实现>>>:在html页面上使用类似于后端的语法操作数据

3、jinja2模块

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

from jinja2 import Template
def get_dict(request):
    user_dict = {'name':'jason','pwd':123,'hobby':['read','run','music']}
    with open(r'templates/myhtml104.html','r',encoding='utf8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(data=user_dict) #将字典传递给html页面 页面上通过data即可获取
    return res

3.1、模板语法

<h1>{{data}}</h1>  以标题一炸死你hi字典
<h1>
    {{data['name']}}  
</h1> 获取字典 键name

<h1>
    {{data.get('pwd')}}
</h1>  获取键pwd

<h1>
    {{data.hoby}}
</h1> 获取键hoby

{% for uer in user_data %}
	<tr>
		<td>{{user.id}}</td>
        <td>{{user.name}}</td>
        <td>{{user.age}}</td>
	</tr>
{% endfor %}  jinjia2 中for循环 语法

4、python主流web框架

django框架
大而全 自身携带的功能非常的多 类似于航空母舰

flask框架
小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块
缺陷:受限于第三方模块的开发

tornado框架
一步非阻塞 该框架快到可以作为游戏服务器
缺陷:上手难度是三者最高的

fastapi框架、sanic框架
最近比较流行的

框架虽多 但是内部逻辑大差不差 我们重点学习一个即可>>>:django
如果你是小白切记不要同时学习上述框架

5、django框架简介

版本问题
1.X:同步
2.X:同步
3.X:异步
你无论使用上面版本都可以 区别不大 2.2

启动注意事项

  1. 计算机名称 尽量不要有中文

  2. 项目中所有的py文件名尽量不要用中文

  3. 不同版本的python解释器配合不同版本的django 会有一些报错

    仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错

    找到那一行代码 把逗号删除即可

    ​ widgets.py 152

  4. 一个pycharm 窗口只允许有一个项目 不要坐项目的嵌套

验证django 是否 下载成功
cmd终端输入django-admin

6、django 基本操作命令

命令行操作

  1. 操作django项目

    django-admin startproject 项目名
    
  2. 启动django项目

    1. 先切换到项目目录下

      cd 项目名

    2. 执行启动目录

      pytho38 manage.py runserver ip:port

  3. 访问django服务端

    浏览器直接访问

  4. 创建app应用

    python38 manage.py startapp 应用名
    

    django框架类似于是一个空壳子 给你提供所需的资源

    至于到底要写哪些功能 需要通过创建app来划分

    eg:django 初始项目可以看成是一所大学

    app就相当于是大学里面的各个学员

parcharm操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QVD2eH34-1661869795326)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20220830205210895.png)]

7、命令行与pycharm操作的区别

命令行不会自动创建templates文件夹

命令行不会再配置文件编写关于templates 文件夹配置

'DIRS':[os.path.join(BASE_DIR,'templates')]

pycharm 自动创建的第一个应用会自动注册到配置文件中

针对db.sqlites3 文件不用去在乎它没有创建 只要运行了django 会自动出来

8、django目录结构

8.1、项目同名文件夹

文件名主要作用
__init__.py很少用 主要做一些冷门的配置
settings.py项目配置文件
urls.py对应关系
wsgi.pydjango服务 基本不用
manage.pydjango入口文件

8.2、templates 文件夹

存储项目所需的html文件

8.3、应用文件夹(可以有多个)

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

特殊核心 文件

urls.py
路由层:记录对应关系

views.py
视图层:核心逻辑层(

templates
模板层:专门存html文件

models.py
模型层:存储与数据库 表 相关的类

9、django小白必会三板斧

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

def index(request):
    return HttpResponse('heillo django2222')

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

def func(request):
    user_dict={'name':'kk','pwd':'123'}
    return render(request,'a.html',{'data':user_dict})

redirect
主要用于页面重定向

def login(request):
    return redirect('https://www.baidu.com')

作业

def mysql(request):
    import pymysql
    conn=pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='html_db',
        charset='utf8',
        autocommit=True
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'select * from html1'
    cursor.execute(sql)
    user_data = cursor.fetchall()
    return render(request,'mysql.html',{'user_data':user_data})

mysql.html

<body>
<div class="container">
    <div class="row"></div>
    <h1 class="text-center">用户信息</h1>
    <table class="table table-bordered table-hover">
        <thead>
            <tr class="info">
                <th>编号</th>
                <th>用户</th>
                <th>密码</th>
            </tr>
        </thead>
        <tbody>
        {% for user_list in user_data %}
            <tr class="danger">
                <td>{{ user_list.id }}</td>
                <td>{{ user_list.name }}</td>
                <td>{{ user_list.pwd }}</td>
            </tr>
        {% endfor %}
        </tbody>
    </table>


</div>
</body>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nl8YI2bS-1661869795328)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20220830222453240.png)]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值