未归类

** 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_socketclient_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-urlencodedmultipart/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的问题。

posted @ 2024-04-30 17:37  黄紫荆  阅读(2)  评论(0编辑  收藏  举报