未归类
** Learning Record**
Q1.****
套接字对象可以是服务器也可以是客户端吗?因为我看到过两种写法:server = socket.socket()和client= socket.socket()
answer: 是的,套接字对象可以用来创建服务器端或客户端。在 Python 的 socket
模块中,socket.socket()
函数创建了一个套接字对象,这个对象可以配置为服务器(监听和接受连接)或客户端(发起连接)。
套接字对象的行为(服务器或客户端)取决于你如何使用它。以下是两种不同用法的简单示例:
### 服务器端套接字,服务器端套接字会绑定到一个地址和端口上,并监听来自客户端的连接请求。
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建 TCP 套接字
server_socket.bind(('127.0.0.1', 8080)) # 绑定到地址和端口
server_socket.listen() # 开始监听连接
while True:
client_socket, client_address = server_socket.accept() # 接受连接
# 处理连接
client_socket.close() # 关闭客户端套接字
### 客户端套接字,客户端套接字会发起到服务器的连接请求。
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建 TCP 套接字
client_socket.connect(('127.0.0.1', 8080)) # 连接到服务器
# 发送和接收数据
client_socket.close() # 关闭套接字
在这两个示例中,socket.socket()
函数都被用来创建一个新的套接字对象。在服务器端,bind()
方法将套接字绑定到特定的 IP 地址和端口上,listen()
方法使套接字开始监听连接,而 accept()
方法等待并接受传入的连接。在客户端,connect()
方法用于发起到服务器的连接。
变量名 server_socket
和 client_socket
只是变量名,它们不影响套接字对象的行为。你可以使用任何变量名,但为了代码的可读性和维护性,建议使用描述性的变量名来表示套接字的角色。
Q2:
前面发给你的简单的TCP服务器运行以后,在网页出现了127.0.0.1 发送的响应无效。ERR_INVALID_HTTP_RESPONSE报错,修改了sock.send(b'HTTP/1.1 200 OK\r\n\r\nhello big baby!')以后就好了,所以这个HTTP/1.1 200 OK\r\n\r\n是什么呢?
HTTP/1.1 200 OK\r\n\r\n
是一个 HTTP 响应的起始部分,它遵循 HTTP 协议的格式。当你在浏览器中访问一个网页时,浏览器会发送一个 HTTP 请求到服务器,服务器则需要按照 HTTP 协议的规范来发送响应。这个响应包括一个状态行、响应头部(可选),后跟一个空行和响应体。
这里是各个部分的解释:
- HTTP/1.1
:这指定了 HTTP 协议的版本,这里是 HTTP 1.1。
- 200 OK
:这是状态码和状态消息,200 表示请求成功,OK 是状态消息的描述。
- \r\n
:这是一个回车符和换行符,它们用来分隔 HTTP 响应的各个部分。
- \r\n\r\n
:HTTP 头部和响应体之间必须有一个空行,这里用两个 \r\n
表示这个空行。
所以,当你修改 sock.send(b'hello big baby!')
为 sock.send(b'HTTP/1.1 200 OK\r\n\r\nhello big baby!')
后,你实际上是将原始的 TCP 响应修改为了一个有效的 HTTP 响应。这使得浏览器能够正确解析响应,并显示响应体中的 hello big baby!
文本。
在你的简单 TCP 服务器中,如果你想要它能够处理来自浏览器的 HTTP 请求,你需要确保发送的响应遵循 HTTP 协议的格式。这就是为什么添加 HTTP/1.1 200 OK\r\n\r\n
之后浏览器能够正确显示响应的原因。
Q3:
为什么用request.data而不用request.POST.get?
在 Django REST framework (DRF) 中,request.data
返回的是解析后的请求体数据。它适用于处理来自客户端的 JSON、XML 或其他内容类型的数据。request.data
是 DRF 的 Request
对象的一个属性,它提供了对请求数据的访问,无论它是在请求体中以什么格式发送的。
相比之下,request.POST
是 Django 原生 HttpRequest
对象的一个属性,它只包含表单数据。它主要用于处理表单提交的数据,当内容类型是 application/x-www-form-urlencoded
或 multipart/form-data
时使用。
在前后端分离的架构中,客户端通常会发送 JSON 格式的数据作为请求体,而不是传统的表单数据。因此,在 DRF 中使用 request.data
是更好的选择,因为它能够处理 JSON 数据以及其他格式的数据,而 request.POST
只能处理表单数据。
这是为什么在 DRF 中建议使用 request.data
而不是 request.POST
的原因。这样可以确保你的 API 能够接收并正确解析客户端发送的 JSON 或其他格式的数据。
Q4: 使用转换器不能达成用一个单一的url来处理的目的吗
使用 Django 的路径转换器(path converters),你确实可以通过一个单一的 URL 来处理可选的 pk
参数,但这需要正确地设置路径表达式。在 Django 2.0 及以上版本中,你可以使用 path()
函数和其内置的转换器来实现这一点。不过,直接通过 path()
函数实现可选参数稍微有些复杂,因为 path()
函数设计时更倾向于明确的路径模式,而不是像 re_path()
那样的正则表达式。
如果你想要在一个 URL 配置中同时处理有 pk
和没有 pk
的情况,最直接的方法是使用 re_path()
和正则表达式,如我之前的回答所示。不过,如果你偏好使用 path()
函数,你可以考虑将没有 pk
的情况作为一个单独的路径,然后在视图中进行逻辑处理。
然而,基于你的需求,我们可以尝试一个接近的解决方案,即定义两个路径,但它们指向同一个视图。这样做虽然不是单一 URL 配置,但在实践中可以达到相同的效果:
from django.urls import path
from .views import ToDoView
urlpatterns = [
path('api/todo/', ToDoView.as_view(), name='todo-list'), # 用于处理没有 pk 的情况
path('api/todo/<int:pk>/', ToDoView.as_view(), name='todo-detail'), # 用于处理有 pk 的情况
]
这样,你的 ToDoView
视图可以根据 pk
是否为 None
来决定是返回一个列表还是单个项目的详情。这种方法的好处是它保持了 URL 的清晰和直观,同时也利用了 Django 的路径转换器来确保 pk
参数(如果提供)是整数类型。
虽然这不是通过单一 URL 配置来实现的,但它提供了一个清晰、结构化的方式来处理不同的请求类型,同时也遵循了 RESTful API 的设计原则。在大多数情况下,这种方法是首选的,因为它使 URL 设计更加直观和易于理解。
Q5:pip debug是什么意思
pip debug
是一个 pip
命令,它提供了关于 pip
的环境和配置的调试信息。这个命令可以帮助你诊断与 pip
相关的问题,例如安装包时的问题,或者是了解 pip
的某些内部信息。
当你运行 pip debug
命令时,它会输出一些有用的信息,包括但不限于:
- pip
版本
- Python 版本
- 操作系统信息
- 环境变量
- pip
配置文件的位置
- 安装的包的兼容性标签(如 cp37
, cp38
表示 CPython 3.7, 3.8)
- 是否在虚拟环境中运行
这个命令通常用于高级用户或开发者,他们需要详细了解 pip
的工作环境,或者在提交 bug 报告时提供额外的上下文信息。
例如,要运行 pip debug
命令,你可以在命令行中输入:
pip debug
或者,如果你想要更详细的输出,可以使用 -v
选项:
pip debug -v
这将输出更详细的调试信息,可能对解决复杂的问题更有帮助。``
1. 安装django
pip install django
C:/python39
-python.exe
-Scripts
-pip.exe
-django-admin.exe [工具,创建django项目中的文件和文件夹]
-Lib
-内置模块
-site-packages(你安装的模块都会在这里)
-openpyx1
-python-docx
-flask
-django [框架的源码]
执行 python setup.py install,然后开始安装,Django 将要被安装到 Python 的 Lib下site-packages
pip install django==2.1.1 -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
输入以下命令进行检查
>>> import django
>>> django.get_version()
如果输出了Django的版本号说明安装正确。
在cmd中输入pip show django也可以检查是否已经安装django
2. 基于Pycarm创建项目
django中项目会有一些默认的文件和默认的文件夹
2.1 在终端创建项目
打开终端
进入某个目录(项目放在哪里)
在 PycharmProjects创建一个新的文件夹Django_Learning
cd C:\Users\OT905626\PycharmProjects\Django_Learning> 进入这个目录
执行命令创建项目
C:\Users\OT905626\AppData\Local\Programs\Python\Python310\Scripts\django-admin.exe startproject 项目名称
#如果C:\Users\OT905626\AppData\Local\Programs\Python\Python310\Scripts已加入环境变量
django-admin.exe startproject 项目名称
2.2 在Pycharm创建项目(需要专业版)
New Project------选择Django------Location 选择自己要放在哪里(一定不要选python的安装目录里面)------Interpreter 选择自己的python解释器版本------Create
其他settings不用管
-
通过命令创建项目,是比较标准的
-
通过Pycharm创建项目,在标准的基础上,添加了template目录,先删除;在settings py文件里面,也添加了数据在DIR[]中,也删掉
2.3 默认项目文件的介绍:
mysite
manage.py (项目的管理,启动项目,app创建,数据管理,常常用,不要动)
__init__.py
urls.py (URL和函数的对应关系, 常常修改)
settings.py (项目配置文件, 常常修改)
asgi.py (异步式,用于接受网络请求,不要动)
wsgi.py (同步式,用于接收网络请求,不要动)
3. 创建 APP
一个小功能就是一个app
-项目
-app,用户管理 [数据表结构,函数,HTML模板,CSS]
-app,订单管理 [表结构,函数,HTML模板,CSS]
-app,后台管理 [表结构,函数,HTML模板,CSS]
-app,网站 [表结构,函数,HTML模板,CSS]
-app,API [表结构,函数,HTML模板,CSS]
...
相互独立,放在同一个项目下
注意:目前开发比较简洁,用不到多APP,一般情况下,项目下创建一个app即可
#在terminal用命令创建文件夹
C:\Users\OT905626\PycharmProjects\Django_Learning\mysite> python manage.py startapp app01
#这样就在mysite文件夹下创建了app01
也可以:
C:\Users\OT905626\PycharmProjects\Django_Learning\mysite>django-admin startapp app01
tree
├─app01
│ └─migrations 【固定,不用动】数据库变更记录
| |_ __init__.py
| __init__.py
| admin.py 【固定,不用动】django默认提供了admin后台管理
| apps.py 【固定,不用动】app启动类
| models.py 【**重要】对数据库操作,orm
| tests.py 【固定,不要动】单元测试
| views.py 【**重要**】函数,要把该函数写在urls.py里面
└─mysite
└─__pycache__
4. 快速上手
- 确保app已注册
apps.py文件下有以下内容:
class App01Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app01'
在settings.py文件中的INSTALLED_APPS最后一行:
'app01.apps.App01Config'
- 编写URL和视图函数的对应关系 urls.py
#导入模块
import app01 import views
urlpatterns = [
#path('admin/', admin.site.urls),
把path这行给注释掉
替换成
path ('index/', views.index), # views.函数
- 编写视图函数 views.py
from django.shortcuts import render, HttpResponse
# Create your views here.
def index(request):
return HttpResponse('欢迎使用')
-
启动django项目
python manage.py runserver
界面中有开始结束按钮,点击即可
点击网址
在网址中添加输入刚刚的/index/,跳转到提示”欢迎使用“
4.1 再写一个页面
-url ->函数
-函数
urls.py 创建关系
views.py写页面
http://127.0.0.1:8000/user/add/
http://127.0.0.1:8000/user/list/
http://127.0.0.1:8000/index/
4.2 templates模板
在创建templates文件夹时,(让django给用户返回一个html)碰到问题:html模板,视图函数,以及url路径都是完整的,但是在运行时,出现报错,提示无法找到html文件.
原因:没有在settings配置文件中的INSTALLED_APP中添加app配置
#上面返回的内容只是一个字符串,“欢迎使用”,“用户列表”,“添加用户”,这些都只是字符串
#如果想要要return一个html,那么定义函数时就不能return httpresponse而是render
def user_list(request):
#在app文件夹下创建一个名为templates的文件夹,在其中新建名为user_list的html文件,(根据app的注册顺序,逐一去他们的templates文件下找),原来根目录下默认是有一个templates文件夹的,在前面的学习过程中删掉了,就是settings.py里面的那个DIR[],否则否则返回的是根目录下html的内容,根目录的需要提前配置,不配置无效
return render(request,"user_list.html") #两个参数
def user_add(request):
return render(request,"user_add.html")
4.3 静态文件
在开发过程中:
- css
- js
- 图片
都会当作静态文件处理
4.3.1 创建静态文件夹
一般会在app文件夹下创建static文件夹,用来放静态文件,在其中再创建css,img,js,plugins文件夹
4.3.2 引用静态文件夹
bootstrap安装配置:
1.打开bootstrap官方页面点击Download,进入页面点击Compiled CSS and JS下方的Download,下载得到一个bootstrap-5.3.1-dist.zip格式的压缩包
2.解压后,有同名文件夹,文件夹包含css和js两个文件夹,css文件夹下是样式表文件,用于页面的布局和美化;js文件夹下为js库文件,完成页面对js效果的支持
3.打开css文件夹,bootstrap提供了不同量级的样式表文件。bootstrap.css提供了完整版的样式库,文件名中含有min的,是压缩版文件,文件名中含有grid,布局部分只包含栅格系统,工具部分只包含flask工具,文件名中含有reboot的,只包含简化版的内容支持
4.打开js文件夹,文件名中含有bundle的js库,已经集成了porper.js.bootstrap的某些组件,例如下拉菜单,框等,它们的js行为效果需要依赖porper.js,开发者可以根据项目的实际需求,以及开发的不同阶段选择适合的css库和js库
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-5.3.1-dist/css/bootstrap.css' %}">
</head>
<body>
<h1>用户列表</h1>
<input type="text" class="btn btn-primary" value="新建"/>
<img src="{% static 'img/1.jpg' %}">
<script src="{% static 'js/jquery-3.7.1.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-5.3.1/js/bootstrap.js' %}"></script>
</body>
</html>
Django内部,使用通配符的方法做静态文件,{% load static %},更方便操作,哪怕项目名字更改了
这部分代码我在运行时出现了问题:
1.{% load static %}一为文本的方式出现在网页中(浏览器问题)
2.图片无法显示,我的图片路径似乎也没有出错检查了好几遍
3.”新建“格式非按钮,而是一个蓝色的可输入更改的文本框
以上出现的问题找到了原因:使用的pycharm是社区版的,不是专业版,所以load static下方不仅有下划线,再加上浏览器不兼容,和bootstrap版本不兼容的的原因,导致2,3的问题。