Day55 web框架 入门 Django

Day55 web框架 入门 Django

文章目录

  • Day55 web框架 入门 Django
    • 1、纯手撸web框架
    • 2、基于wsgiref
      • 2.1、动静态网页
      • 2.2、新需求
    • 3、jinja2模块
      • 3.1、模板语法
    • 4、python主流web框架
    • 5、django框架简介
    • 6、django 基本操作命令
    • 7、命令行与pycharm操作的区别
    • 8、django目录结构
      • 8.1、项目同名文件夹
      • 8.2、templates 文件夹
      • 8.3、应用文件夹(可以有多个)
    • 9、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操作
Day55 web框架 入门 Django_第1张图片

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.py django服务 基本不用
manage.py django入口文件

8.2、templates 文件夹

存储项目所需的html文件

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

文件名 作用
migations文件夹 orm相关(数据库打交道的记录)
__init__.py 很少用 主要做一些冷门配置
admin.py django自带的后台管理
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>

Day55 web框架 入门 Django_第2张图片

你可能感兴趣的:(python,jquery,javascript,django)