django之day01

一:纯手撸web框架(思路)

1.什么是web框架?
  • 基于互联网的web服务端

2.请求方式都有哪几种?

  • 1.post:向服务端提交数据
  • 2.get:向服务端索要数据
2.代码
import socket

server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)

while True:
    sock, addr = 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]
    print(target_url)  # / /index /register

    if target_url == '/index':
        sock.send(b'index')
    elif target_url == '/register':
        sock.send(b'register')
    else:
        sock.send(b'404 error')
3.上面代码存在的缺陷
  • 1.socket代码冗余
  • 2.对请求数据格式的处理复杂且重复
  • 3.不同的后缀匹配相应网址的方法太LOW

二:基于wsgiref模块写web框架(思路),以及代码的优化

1.目的:
  • 推导django框架的产生过程

  • 启动文件

from wsgiref.simple_server import make_server
from urls import urls
from views import *


def run(request, response):
    """
    :param request: 请求数据
    :param response: 响应数据
    :return: 返回给客户端的数据
    """
    response('200 OK', [])  # 固定代码
    target_path = request.get('PATH_INFO')
    func_name = None
    for url_tuple in urls:
        if url_tuple[0] == target_path:
            func_name = url_tuple[1]
            break  # 
    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)
    server.serve_forever()  # 永久启动
  • urls.py文件
from views import *
urls = (
    ('/home', home),
    ('/index', index),
    ('/login', login),
    ('/register', register),
)
  • views.py文件
def index(request):
    return 'index'
def login(request):
    return 'login'
def register(request):
    return 'register'
2.解决了哪些问题?
  • 1.socket代码冗余
  • 2.对请求数据格式的处理复杂且重复

三:如何使用jinja2模块

1.功能: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) 
    return res

四:动静态网页

1.动态网页:页面上的数据是从后端传入的

2.静态网页:页面上的数据是固定写好的,要修改只能修改源码

五:模板语法

<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框架

1.django框架

​ 大而全 自身携带的功能非常的多 类似于航空母舰
​ 缺陷:开发小项目的时候使用该框架有点笨重(大材小用)

2.flask框架

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

3.tornado框架

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

4.fastapi框架、sanic框架、…

​ 最近流行的

七:django框架简介

1.版本:
  • 1.x 同步 1.1
  • 2.x 同步 2.2
  • 3.x 同步 3.2

八:django的基本操作命令

1.创建django项目:django-admin startproject 项目名称

2.启动django项目:

  • 1.先切换到项目目录下:cd 项目目录
  • 2.执行这个命令:python38 manage.py runserver ip:port
  • 3.创建app: python38 manage.py startapp 应用名称

九:命令行创建和pycharm创建的django项目的区别

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

十:django的目录结构

    1. settings.py 配置文件
    2. urls.py 路由层
    3. 3.wsgi.py django服务 基本不用
    4. manage.py 入口文件
    5. templates文件夹 模板层
    6. migrations文件夹 orm相关的数据库操作记录
    7. admin.py django自带的后台管理
    8. models.py 模型层
    9. tests.py 自带的测试文件
    10. views.py 视图层
    11. db.sqlite3 自带的小型数据库

十一:小白必会3板斧

    1. HttpResponse 返回字符串类型的数据
  • def index(request):
        return HttpResponse('这是一个视图函数')
    
    1. render 返回html页面,支持模板语法
  • def index(request):
        return render(request, 'index.html')
    
    1. redirect 重定向
  • def index(request):
        return redirect('https://www.baidu.com')
    

作业:

路由层

urlpatterns = [
    path('show_info/', views.show_info),
]

视图层

from jinja2 import Template
import pymysql
def show_info(request):
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='888',
        database='dj01',
        charset='utf8',
        autocommit=True
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'select * from userinfo'
    cursor.execute(sql)
    user_data = cursor.fetchall()
    with open(r'templates/1.html', 'r', encoding='utf8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(user_data=user_data)
    return HttpResponse(res)

html文件

<div class="container">
        <div class="row">
            <h1 class="text-center">数据展示</h1>
            <div class="col-md-8 col-md-offset-2">
                <table class="table table-hover table-striped">
                    <thead>
                        <tr>
                            <th>主键</th>
                            <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>
                                <td>{{user.hobby}}</td>
                            </tr>
                        {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>

结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值