首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一. 前言
上一篇只是看了一些 Python 和 Java 对标的框架,这一篇主要是应用。
选择的 Web 组件是 Python 里面的 Django ,这不一定是一个最佳的框架或者最快的框架,当时他应该算是一个最成熟的框架。
学习嘛,不追求性能,先看看这个框架应该是有利于了解 Python 全貌的。
二. 初阶使用
2.1 django 的使用
这是一个最常见的第三方库的使用方式, Django 对标 Java 的 Spring , 在 Python 操作如下 :
- S1 : 命令行中通过 pip 下载第三方组件 (国内正常网络都可以下载)
- pip install django
- S2 : 通过提供的工具创建项目
- django-admin startproject YouProjectName
- S3 : 直接在项目中运行
- python manage.py runserver
- S4 : 访问路径44
- http://127.0.0.1:8000/
2.2 创建第一个接口
首先要知道,前面S2创建的目录结构是这样的 ,然后我在这个目录下面创建了一个 API
- project
|- manage.py
|- project
|- settings.py
|- urls.py
|- api (自己手动创建)
|- TestController.py
S1 : 创建自己的 API 类
from django.http import JsonResponse
def hello(request):
data = {
'message': 'Hello, API!'
}
return JsonResponse(data)
S2 : 设置 URL 引用
这里我首先通过 from 引用了这对象,这里 api.TestController 就像我们的包名,hello 就是包里面的方法
from django.contrib import admin
from django.urls import path
from api.TestController import hello
urlpatterns = [
path('admin/', admin.site.urls),
path('api/hello/', hello),
]
阶段总结
在我们使用 django-admin startproject project_name 创建完项目之后,会自动生成几个文件,这几个文件也是该项目的基础
- Parent
|- manage.py
|- ProjectName
|- __init__.py :
|- asgi.py :
|- setting.py :
|- urls.py :
|- wsgi.py :
2.3 Rest 接口
通常 Java 里面会定义 Get 接口和 Post 接口,对应 Python 也有相关的实现 :
import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .dto import person
## 实现 Get 接口
def get_endpoint(request):
response_data = {
"message": "Get 请求成功",
"data" :""
}
return JsonResponse(response_data)
## 实现 Post 接口
@csrf_exempt
def post_endpoint(request):
# 如果这是个 Post 请求 (PS :想直接基于类型可能需要更复杂得框架)
if request.method == 'POST':
data = request.POST
response_data = {
"message": f"接收 POST 数据: {data}"
}
return JsonResponse(response_data)
else:
response_data = {
"error": "Invalid request method"
}
return JsonResponse(response_data, status=400)
## 实现 Post 接口 (接收 JSON 数据)
@csrf_exempt
def post_endpoint_json(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
# 现在 data 是 Python 字典,包含从请求体解析的 JSON 数据
response_data = {
"message": f"接收 JSON 数据: {data}"
}
return JsonResponse(response_data)
except json.JSONDecodeError:
response_data = {
"error": "Invalid JSON data"
}
return JsonResponse(response_data, status=400)
# 实现 Post 接口 (接收对象转换为 Class Bean )
@csrf_exempt
def doPostBean(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
personDto = person.Person(**data)
jsonStr = json.dumps(personDto.__dict__)
response_data = {
"message": "接收对象:"+jsonStr
}
return JsonResponse(response_data)
except json.JSONDecodeError:
response_data = {
"error": "异常 JSON 数据"
}
return JsonResponse(response_data, status=400)
else:
response_data = {
"error": "Invalid request method"
}
return JsonResponse(response_data, status=400)
阶段总结 :
- 也不一定都是在请求中判断 method 方法, Flask 也可以通过注解进行处理
- Python 的组件特别多,想要更丰富的功能可以找其他的组件,但是 python 相对而言不需要那么丰富的 Web 功能
- Post 接口涉及到跨域问题
2.3 相对概念
- Python 是面向对象的,支持类,对象,继承,多态
- Python 同样以模块和包进行分隔
- Python 支持函数式编程
- Python 中有异常处理
- Python具有自动垃圾回收(Automatic Garbage Collection)机制,支持引用计数和循环收集
继承的写法
class Person:
def __init__(self, name):
self.name = name
def user_info(self):
print(f"Name: {self.name}")
# 子类继承父类
class SelfPerson(Parent):
def __init__(self, name, age):
super().__init__(name) # 调用父类的构造函数
self.age = age
def user_info(self): # 子类可以重写父类的方法
print(f"Name: {self.name}, Age: {self.age}")
# 创建子类的实例
child = SelfPerson("gang", 10)
# 调用子类的方法
SelfPerson.user_info()
异常处理的写法
try:
print("执行相关代码")
except SomethingException:
print("Error: Exception show")
except TwoException:
print("Error: 支持多个异常")
else:
print("没有异常时会执行")
finally:
print("支持 Finally")
三. 常用的功能
3.1 语法
for 循环
def get_endpoint(request):
# 这是一个字典 key - value
my_dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
# 这也是一个字典 key,它的value是 None (可以理解为 Set )
my_dict = {'key1', 'key2', 'key3'}
# 这是一个列表 (也可以看成一个数组,但是在业务上其实会有不同)
my_list = [1, 2, 'one', 'two']
# 数组转 Map
names = ['UserName123', 'goods', 'test666']
name_lengths = {name: len(name) for name in names}
print(name_lengths) # -- {'UserName123': 11, 'goods': 5, 'test666': 7}
# 数组循环后处理
numbers = [1, 2, 3, 4, 5]
squared = [x + 2 for x in numbers]
print(squared) # -- [3, 4, 5, 6, 7]
squared = [x ** 2 for x in numbers]
print(squared) # -- [1, 4, 9, 16, 25]
## 数组转Map
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = {x for x in numbers}
print(unique_numbers) # -- {1, 2, 3, 4, 5}
列表操作
def get_endpoint(request):
my_list = [1, 2, 'two']
# 往列表添加数据
my_list.append(4) # 在后面追加
my_list.insert(1, 5) # 在指定索引内插入
print(my_list)
# 合并2个队列
my_list_2 = [7, 8] + my_list
print(my_list_2)
# 添加到尾部
my_list.extend([666,888])
print(my_list)
Map 操作
def get_endpoint(request):
# 创建字典
my_dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
my_dict_key = {'key1', 'key2', 'key3'}
# 访问字典值
print("key value is :"+my_dict["key1"])
keys = my_dict.keys()
values = my_dict.values()
# 设置值
my_dict['key1'] = 'goods'
print("key value is :"+my_dict["key1"])
del my_dict['key1']
# 判断值是否存在
if 'key1' in my_dict:
print("key value is :"+my_dict["key1"])
# 循环字典
for key in my_dict:
print("key value is :"+key)
for key, value in my_dict.items():
print("key value is :"+key+value)
普通文件处理
def readFile(request):
# r : 读取
# w : 写入
# a : 追加
# b : 二进制文件
with open('E://output.txt', 'w') as file:
file.write("Hello, world!")
file.close()
# utf-8 可以不加,用于定义编码
listValue = []
with open('E://output.txt', 'r', encoding='utf-8') as fileRead:
print(fileRead.read())
print(fileRead.readline())
fileRead.close()
Excel 文件处理
def exportExcel(request):
# 创建一个新的Excel工作簿
workbook = openpyxl.Workbook()
sheet = workbook.active
for row in data:
sheet.append(row)
# 保存Excel文件 (保存到相对路径)
workbook.save("data.xlsx")
# 保存到绝对路径
workbook.save("E://data.xlsx")
# 读取 Excel
workbook = openpyxl.load_workbook('E://data.xlsx')
sheet = workbook.active
for row in sheet.iter_rows(min_row=1, max_row=sheet.max_row, min_col=1, max_col=sheet.max_column):
print(row)
for cell in row:
print(cell.value)
方法调用
def search(page, size):
return value
def mysqlSearch(request):
valueSearch = search(page, size)
不需要特意定义返回类型,只要 return 后就表示有返回, 在调用侧直接接收就行。
3.2 MySQL
pip install mysqlclient
# models.py
import json
import re
import pymysql
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
# 代码中创建连接
connection = pymysql.connect(
host='localhost',
user='root',
password='123456',
db='antsso',
cursorclass=pymysql.cursors.DictCursor
)
# 进行一个 QUery 操作
def mysqlSearch(request):
# Read (Select)
valueResponse = []
page = 0
size = 1
print("S1 : 开始进行查询")
while True:
valueSearch = search(page, size)
if len(valueSearch)