Django框架

纯手敲web框架

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

while True:
    sock ,address = server.accept()
    data = sock.recv(1024)
    # print(data.decode('utf8'))
    sock.send(b'HTTP/1.1 200 OK\r\n\r\nhello')
'''web框架可以简单的理解为是基于互联网的web服务端(socket服务端)'''
优化操作
'''根据用户输入的网址的后缀不同 发送不同的内容  简单模拟浏览器的服务端'''
import socket

server = socket.socket()
server .bind(('127.0.0.1',8088))
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]   # 获取用户输入的不同的后缀
    if target_url == '/index':
        sock.send(b'index')
    elif target_url == '/login':
        sock.send(b'login')
    elif target_url == '/reg':
        sock.send(b'reg')
    else:
        sock.send(b'404 error')
基于上述代码的一些问题
1.socket服务端
2.http协议
3.根据网址的后缀不同请求不同的内容
4.请求方式
  get 朝服务端索要数据(访问服务端内容)
  post 朝服务端提交数据(注册,登录等信息)
5.从请求的数据格式中筛选出用户输入的网址的后缀
   target_url= data.decode('utf8').split(' ')[1]
6.代码的缺陷
  1.sock代码重复编写(这个可忽略)
  2.针对请求数据格式的处理复杂且重复
  3.针对不同网址后缀匹配的方式过于繁琐 (多if判断)
  

基于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模块解决了两个问题
	1.socket代码重复编写造轮子
	2.针对请求数据格式的处理复杂且重复
2.思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)
	先从大字典中查找出记录网址后缀的键值对
	1.不推荐使用连续的多个if判断
	2.针对面条版的代码首先应该考虑封装成函数
# 基于问题二再做优化
from wsgiref.simple_server import make_server
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),
)

def run(request, response):
    """
    :param request: 请求数据
    :param response: 响应数据
    :return: 返回给客户端的数据
    """
    response('200 OK', [])  # 固定代码 无需掌握
    # print(request)  # 自动将请求数据全部处理成字典k:v键值对形式
    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]  # 一旦匹配到了内容立刻结束for循环
            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)  # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
    server.serve_forever()  # 永久启动

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

动静态网页

动态网页: 就是网页上的代码不是固定写死的,可以随时修改添加(获取用户输入等)
静态网页:网页上的代码是写死的,如果想要修改的话,只能修改源码
代码实操:

def get_time(request):
    import time
    ctime = time.strftime('%Y-%m-%d %H:%M:%S')
    with open(r'templates/myHtml02.html', 'r', encoding='utf8')as f:
        data = f.read()
    data = data.replace('美好的事情即将发生' ,ctime)
    return data

jinja2模块

第三方模块 在终端用pip install jinja2 即可下载

'''jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型'''
from jinja2 import Template
def get_dict(request):
    user_dict = {'name':'summer', 'age': 18}
    with open(r'templates/myHtml03.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 %}
前后端,数据库,三者联动

html内容

body>
  <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>
                  </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>

image

后端内容

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(r'templates/myHtml.html','r',encoding='utf8')as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(user_data = user_data)
    return res

数据库内容

create table userinfo(id int primary key auto_increment,name varchar(32),age int);
insert into userinfo(name,age) value('summer',18),('jerry',18),('jason',88);

image

python主流web框架

1.django框架
 大而全,自身携带的功能非常的多,类似于航空母舰
 缺陷:开发小项目的时候使用该框架有点笨重(大材小用)
 
2.flask框架
 小而精 自身携带的功能非常的少,主要依赖第三方模块,第三方模块抢它就强
 缺陷:受限于第三方模块的开发
 
3.tornado框架
  异步非阻塞 该框架可以作为游戏服务器
  缺陷:上手难度是三者最高的
  
 fastapi框架 ,sanic框架 等等。。
 框架虽然很多,但是内部逻辑都差不多,重点学习一个即可

django框架简介

1.版本问题
	1.X:同步		1.11
	2.X:同步		2.2   
	3.X:异步		3.2
ps:各版本之间区别不大 需要注意的是 带有LTS字样的版本才是官方现在维护的版本
启动注意事项
1.计算机名称尽量不要使用中文 (可能会报错)
2.项目中所有的py文件尽量不要使用中文
3.不同版本的python解释器配合不同版本的django会有一些报错问题
  ps:仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错
       找到那一行代码 把逗号删除即可 widgets.py  152 
4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套

image

image

django基本操作命令

1.命令行
  创建django项目
   django-admin startproject 项目名
   启动django项目
   1.先切换到项目目录下 cd 项目名
   2.执行启动项目
    python manage.py runserver IP:port(127.0.0.18080)
   访问django服务端
    浏览器直接访问
    创建app应用
	python manage.py startapp 应用名
2.pycharm  直接鼠标点击
  '''一定要注意:在启动django项目的时候,一定要保证一个端口只有一个项目'''
命令行与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
	主要用于直接返回字符串类型的数据
render
	主要用于返回html页面 并且支持模板语法
redirect
	主要用于页面重定向
posted @   Hsummer  阅读(645)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示