Django(一、简介,安装与使用)

文章目录

  • 一、Django引入
      • 1.web应用程序
            • 什么是web?
            • web引用程序的优点
            • web应用程序的缺点
            • 什么是web框架
      • 2.纯手写web框架
            • 1.web框架的本质
            • 2.HTTP协议的特性:
            • 3.编写
            • 基于wsgire模块搭建web框架
            • 代码封装优化
            • 代码封装
  • 二、Django框架的学习
      • 1.Python中的主流框架
      • 2.如何使用Django:
            • 1.版本问题
            • 2.运行Django注意事项
            • 3.下载
            • 4.验证
            • 5.常见命令
            • 6.pycharm自动创建django项目
      • 3.Django app的概念
            • 创建应用
            • 注册应用
      • Django小白必会三板斧

一、Django引入

1.web应用程序

什么是web?

web应用程序是一种可以通过web访问的应用程序,用户只需有浏览器即可,不需要再安装其他软件
比如:淘宝网、京东网、博客园等都是基于web应用的程序

应用程序有两种模式C/S、B/S
C/S是客户端/服务端程序,也就是说这类程序一般独立运行。而B/S就是浏览器端/服务端应用程序,这类应用程序一般借助IE等浏览器来运行。web应用程序一般是B/S模式

web引用程序的优点
  1. 你所需要的就只是一个适用的浏览器
  2. 节省硬盘空间
  3. 它们不需要更新,因为所有的新特性都在服务器上执行,从而自动传达到用户端
  4. 可以跨平台使用:windows,Mac,Linux等等
web应用程序的缺点

严重依赖服务端正常运行,一旦服务端出现问题,客户端就会受到影响

什么是web框架

被人写好的框架(就是一堆文件和目录),我们只需要在固定的位置写代码即可

2.纯手写web框架

1.web框架的本质

web框架本质上可以看成是一个功能强大的socket服务端,用户的浏览器可以看成是拥有可视化界面的socket客户端。两者通过网络请求实现数据交互,学者们也可以从架构层面上先简单的将Web框架看做是对前端、数据库的全方位整合
在这里插入图片描述

2.HTTP协议的特性:

1.四大特性
基于请求响应
基于TCP协议之上的应用层协议
无状态
短连接

2.请求数据格式
请求首行(请求方式、协议、版本号、路径)
请求头
\r\n
请求体
\r\n
请求体(get请求方式是没有请求体的、POST请求方式才有请求体)

3.响应数据格式
响应首行()
响应头
\r\n
响应体()

4.响应状态码
1xx
2xx
3xx
4xx
5xx

3.编写
import socket

server = socket.socket()  # 默认是TCP协议
server.bind(('127.0.0.1', 8800))  # IP PORT
server.listen(3)  # 半连接池

while True:
    sock, addr = server.accept()  # 等待连接
    data = sock.recv(1024)  # 字节bytes
    sock.send(b'http/1.1 200 ok\r\n\r\n')  
    data_str = data.decode()  # 转码
    data_list = data_str.split(' ')[1]  # 切分后索引取值
    print(data_list)
    if data_list == '/index':
        sock.send(b'hello index')
    elif data_list == '/login':
        sock.send(b'hello login')
    else:
        sock.send(b'hello home')

当前的服务端存在什么问题?

  1. socket部分需要每次都需要我们自己写
  2. 我们需要自己每次处理HTTP格式的数据,自己转码、切分、取值等
  3. 没有解决高并发问题

以上的问题怎么优化呢?
借助于wsgiref模块的使用

基于wsgire模块搭建web框架
from wsgiref.simple_server import make_server

def run(request, response):
    """
    :param request: 请求相关数据
    :param response: 响应相关数据
    :return: 返回给客户端的真实数据
    """
    response('200 OK', [])  # 固定格式 不用管它
    # print(request)  是一个处理之后的大字典
    path_info = request.get('PATH_INFO')
    if path_info == '/index':
        return [b'index']
    elif path_info == '/login':
        return [b'login']
    return [b'hello wsgiref module']


if __name__ == '__main__':
    server = make_server('127.0.0.1', 8080, run)  # 实时监听127.0.0.1:8080 一旦有请求过来自动给第三个参数加括号并传参数调用
    server.serve_forever()  # 启动服务端
代码封装优化
1.网址后缀的匹配问题
2.每个后缀匹配成功后执行的代码有多有少
	面条版	函数版	模块版
3.将分支的代码封装成一个个函数
4.将网址后缀与函数名做对应关系
5.获取网址后缀循环匹配
6.如果想新增功能只需要先写函数再添加一个对应关系即可
7.根据不同的功能拆分成不同的py文件
	views.py		存储核心业务逻辑(功能函数)
 	urls.py			存储网址后缀与函数名对应关系
 	templates目录	   存储html页面文件
8.为了使函数体代码中业务逻辑有更多的数据可用
	将request大字典转手传给这个函数(可用不用但是不能没有)
代码封装

1.逐次拆分出来
模块封装功能

from wsgiref import simple_server

def run(request, response):
    """
    :param request: 请求相关的数据
    :param response: 响应相关的数据
    :return: 返回给客户端的展示数据
    """
    response('200 OK', [])  # 固定编写 无需掌握    
    return [b'hello jason']

if __name__ == '__main__':
    server = simple_server.make_server('127.0.0.1', 8080, run)
    '''监听本机8080端口 一旦有请求访问 自动触发run方法的执行'''
    server.serve_forever()
# 模块封装了socket代码并将请求数据处理成诸多k:v键值对

路由对应响应

# run函数体中添加下列代码
current_path = request.get("PATH_INFO")
if current_path == '/login':
   return [b'hello login html']
elif current_path == '/register':
   return [b'hello register html']
return [b'404 error']

2.封装成函数

def register(request):
    return 'register'

def login(request):
    return 'login'

def error(request):
    with open(r'templates/error.html', 'r', encoding='utf8') as f:
        return f.read()

urls = (
    ('/login',login),
    ('/register',register)
)

def run(request, response):
    func_name = None
    for url_tuple in urls:  
        if current_path == url_tuple[0]:
            # 先获取对应的函数名
            func_name = url_tuple[1]
            # 一旦匹配上了 后续的对应关系就无需在循环比对了
            break
    # for循环运行完毕之后 func_name也有可能是None
    if func_name:
        res = func_name(request)
    else:
        res = error(request)  # 顺手将request也传给函数 便于后续数据的获取
    return [res.encode('utf8')]

将后缀匹配单独做一个模块

# 后缀匹配
urls = (
    ('/register', register),
    ('/login', login),
    ('/index', index),
)

服务端启动文件

from wsgiref import simple_server
from urls import urls
from views import error

def run(request, response):
    response('200 OK', []) 
    current_path = request.get("PATH_INFO")
    func_name = None
    for url_tuple in urls:  # ('/register', register)
        if current_path == url_tuple[0]:
            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 = simple_server.make_server('127.0.0.1', 8080, run)
    server.serve_forever()

请求后缀相对应的响应

def register(request):
    return 'register'

def login(request):
    return 'login'

def index(request):
    return 'index'

def error(request):
    with open(r'templates/error.html', 'r', encoding='utf8') as f:
        return f.read()

总结拆分后要是想新增一个功能,只能在view.py中编写函数,urls.py添加对应关系即可

3.模板文件和静态文件

templates文件夹   存储HTML文件
static文件夹      存储HTLML页面所需静态资源

二、Django框架的学习

1.Python中的主流框架

Django框架:最主流的,市场占用率90%以上,笨重的框架,里面自带了很重的模块,不适用于小项目,类似于航空母舰

falsk框架:轻量级的,小而美,自带的功能比较少,需要安装很多的第三方模块,当你安装的模块足够多的时候,也差不多跟Django差不多了

tornado框架:异步非阻塞、高性能、学这个框架成本有点高、解决的并发量挺高的,它一般用在特殊的场景

fastapi框架:它主要用来写一些接口,不写页面,他只负责写业务逻辑

2.如何使用Django:

1.版本问题
django 1.x    同步      1.11
django 2.x    同步      2.2       常用
django 3.x   支持异步    3.2
django 4.x   支持异步    4.2
版本之间的差异其实不大,主要是添加了额外的功能
2.运行Django注意事项

1.django项目中所有的文件名目录名不要出现中文
2.计算机名称尽量不要出来中文
3.一个pycharm尽量就是一个完整的项目(不要嵌套和叠加)
4.不同版本的python解释器与不同版本的django可以会出现问题

3.下载

pip3 install django 默认最新版
pip3 install django版本号 指定版本
pip3 install django
2.2.22
pip下载模块会自动解决依赖问题(会把关联需要用到的模块一下下载)

4.验证
django-admin
5.常见命令
1.创建django项目
	django-admin startproject  项目名
2.启动django项目
	cd 项目名
    python38 manage.py runserver ip:port
6.pycharm自动创建django项目
pycharm会自动创建django项目,但是配置文件中可能会报错,需要改目录配置
	os.path.join(BASE_DIR,'templates')

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.Django app的概念

Django框架就类似于是一所大学,一所大学也要有二级学院
应用就类似于是二级学院,一个Django框架至少要有一个应用

创建应用

1.终端命令创建应用

python38 manage.py startapp 应用名

2.pycharm创建应用
在这里插入图片描述
新建Django项目的时候默认创建一个,并且会自动注册应用

注册应用

在你的Django项目里找到settings.py文件,找到INSTALLED_APPS列表,添加应用名
在这里插入图片描述

Django主要目录结构

django2                 项目名称
	app01				应用名称
	migrations			用来存储数据库迁移记录
	__init__.py			
	admin.py			跟后台项目注册相关
	apps.py             跟一些注册相关
	models.py			数据库  模型层
	tests.py   			测试文件
	views.py			视图文件,写一些后端逻辑
django2
	__init__.py			
	settings.py			配置相关
	urls.py				路由相关
	wsgi.py				内部封装wsgiref服务器
templates				模型文件夹,需手动创建,pycharm自动创建
db.sqlite3				Django自带的小型数据库
manage.py				Django框架的入口文件

Django小白必会三板斧

frpm django.shortcuts import render,HttpResponse,redirect

HttpResponse       返回字符串类型的数据
render             返回HTML页面并且支持传值
redirect           重定向

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/125006.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Kinect 动捕XR直播解决方案 - 硬件篇

Kinect-V2 硬件设备 一、Kinect介绍 1、Kinect for Windows 的开发配置 Kinect V2 操作系统:Windows 10(必须) Windows Surface Windows Surface 2 开发环境:Visual Studio 2017 .NET Framework 4.5 (.NET Framework 4.5) 硬…

vue实现商品列表,组件抽离

1.需求说明 my-tag 标签组件封装 ​ (1) 双击显示输入框,输入框获取焦点 ​ (2) 失去焦点,隐藏输入框 ​ (3) 回显标签信息 ​ (4) 内容修改,回车 → 修改标签信息 my-table 表格组件封装 ​ (1) 动态传递表格数据渲染 ​ (2) 表头支…

竞赛 深度学习疲劳检测 驾驶行为检测 - python opencv cnn

文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习加…

使用EvoMap/Three.js模拟无人机灯光秀

一、创建地图对象 首先我们需要创建一个EM.Map对象,该对象代表了一个地图实例,并设置id为"map"的文档元素作为地图的容器。 let map new EM.Map("map",{zoom:22.14,center:[8.02528, -29.27638, 0],pitch:71.507,roll:2.01,maxPit…

JavaScript中的宏任务和微任务

面试中经常会被问到什么宏任务和微任务?工作中也会出一个奇怪的问题,两行代码,一会A结果现出来,一会B结果先出来,搞得一头雾水。有些人为了懒省事,全都是用async await,亦或者写个setTimeout&am…

kubernetes集群编排——k8s认证授权

pod绑定sa [rootk8s2 ~]# kubectl create sa admin [rootk8s2 secret]# vim pod5.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec:serviceAccountName: admincontainers:- name: nginximage: nginxkubectl apply -f pod5.yamlkubectl get pod -o yaml 认证 [rootk8s…

mysql之高阶语句

1、使用select语句,用order by对表进行排序【尽量用数字列进行排序】 select id,name,score from info order by score desc; ASC升序排列(默认) DESC降序排列(需要添加) (1)order by结合whe…

(待完善)python学习参考手册

这里写目录标题 观前浅谈:学习路线 :学习心得笔记:Step1:简单但一问不知怎么的组织语言去回答的小问题:什么是提示符?python解释器是什么?请正在阅读本文的朋友,安装一下PyCharm以及如何进行科学的省钱:Python中的命令行模式和交互模式的区别是什么?请正在阅读本文的朋友安装…

【深度学习】Python爬取豆瓣实现影评分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、任务描述二、使用步骤1.数据爬取1.2.对爬取的页面数据进行解析,并保存为JSON文件2、数据分析2.1数据分析之评论时间分布图2.2角色评分 前言 爬…

简洁的 Markdown 文本编辑器 Typora

文章目录 简介块元素段落和换行符标题引用文字列表任务列表(栅栏式)代码块数学块表格脚注水平线YAML Front Matter目录 (TOC)图表 (Sequence, Flowchart and Mermaid) Span 元素链接内部链接参考链接 URL网址图片强调(斜体)粗体代…

JavaFX入门和网格布局面板的使用,Dao层交互,舞台与场景切换以及其他控件的使用

网格布局 将整个面板划分为若干个格子 , 每个格子的大小是一样的 , 每个格子中可以放置一个控件(布局) , 类似于表格的方式。在网格布局 中放入控件的时候 , 还需要指定位置。 GridPane gridPane new GridPane(); 我们将要排出这个布局 , 也就是登陆页…

【k8s】数据存储

一、数据存储的概念 pod的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。…

考研408-计算机网络 第二章-物理层学习笔记及习题

第二章 物理层 一 通信基础 1.1 物理层基本概念 1.1.1 认识物理层 物理层目的:解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是具体的传输媒体。 物理层主要任务:确认与传输媒体接口有关的一些特性,需要进行定义标…

几种解决mfc140.dll文件缺失的方法,电脑提示mfc140.dll怎么办

电脑提示mfc140.dll缺失,如果你不去处理的话,那么你的程序游戏什么都是启动不了的,如果你想知道有什么方法可以解决那么可以参考这篇文章进行解决,今天给大家几种解决mfc140.dll文件缺失的方法。电脑提示mfc140.dll也不用担心解决…

每日一题 --- 力扣2003—每棵子树内缺失的最小基因值

图片借用B站灵茶山文艾府 打卡代码&#xff08;记得看&#xff0c;有注释&#xff09;&#xff1a; class Solution { public:vector<int> smallestMissingValueSubtree(vector<int> &parents, vector<int> &nums) {int n parents.size();vector&l…

pytorch与cudatoolkit,cudnn对应关系及安装相应的版本

文章目录 一.cuda安装二、nvidia 驱动和cuda runtime 版本对应关系三、安装cudatoolkit,cudnn对应版本四、cuda11.2版本的对应安装的pytorch版本及安装五、相关参考 一.cuda安装 1.确定当前平台cuda可以安装的版本 安装好显卡驱动后&#xff0c;使用nvidia-smi命令可以查看这个…

为什么很多人从FPGA转IC前端岗?哪个前景好?

很多入行不久的朋友潜意识里会认为FPGA是很高深的东西&#xff0c;能掌握FPGA的一定都是极其厉害的人。 其实&#xff0c;这是一个误解。 我们所讨论的FPGA只是基于已有的FPGA芯片去做后端排列组合的工作内容&#xff0c;而不是设计制造新的FPGA芯片&#xff0c;世界上能做这…

Blocking waiting for file lock on the registry index 问题解决

问题表现&#xff1a; cargo build时一直卡在Blocking waiting for file lock on the registry index。 解决方法&#xff1a; 1、之前在linux下出现过一次&#xff0c;采用这种方法解决了&#xff1a;rust - Cargo build hangs with " Blocking waiting for file lock…

图扑智慧农业:农林牧数据可视化监控平台

数字农业是一种现代农业方式&#xff0c;它将信息作为农业生产的重要元素&#xff0c;并利用现代信息技术进行农业生产过程的实时可视化、数字化设计和信息化管理。能将信息技术与农业生产的各个环节有机融合&#xff0c;对于改造传统农业和改变农业生产方式具有重要意义。 图…

[Linux/UOS]同一解决方案下的控制台程序依赖SO库的方法

该方法是基于VS2019的远程调试Linux的方案&#xff0c;使用的是UOS系统&#xff0c;本文不会去详述如何远程调试Linux和如何新建解决方案中的.so项目和.out项目 只关注于如何令.out项目依赖.so&#xff0c;并成功调用运行 以一个如上图结构的解决方案为例子&#xff0c;SysInfo…