个人所有文章整理在此篇,将陆续更新收录:知无涯,行者之路莫言终(我的编程之路)


本文杂记了下面一些点
[1].Python的原生版Socket
[2].python自带的模块:`wsgiref`的简单使用
[3].Python和Idea的爱恨情,pip装了模块但不能用,或飘红了但能用
[4].随手一说 jinja2
[5].django的简单介绍
[6].django中使用MySQL数据库
复制代码

一、先看看Socket吧

客户端 通过url 查询IP和端口号 建立TCP/IP连接 将请求信息及数据 发送给服务端 并制定资源地址
服务端 接收请求及数据 根据资源地址 进行处理 返回响应信息及数据 给客户端
复制代码

1.用浏览器访问服务

socket.accept()方法会阻塞下面语句的继续,当有连接时便会接触阻塞

import socketif __name__ == '__main__':socket = socket.socket()  # 生成socket对象socket.bind(("127.0.0.1", 8089))  # 绑定IP和端口socket.listen()  # 监听conn, addr = socket.accept()  # 获取连接 -- 阻塞方法data = conn.recv(1024 * 8)  # 接收客户端数据conn.send(b"HTTP/1.0 200\r\n")  # 响应头conn.send(b"\r\n")  # 空行conn.send(b"hello from server")  # 响应数据print(data)socket.close()conn.close()
复制代码

抓一下包,看一下请求与响应

|--- 抓包获取的客户端请求数据-----------------
GET http://127.0.0.1:8089/ HTTP/1.1
Host: 127.0.0.1:8089
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9|--- 抓包获取的服务端响应数据---------------------
HTTP/1.0 200hello from server
复制代码

2.服务端如何发送一个静态页面给客户端

不作处理返回原样,也就是整个html的文件字符

import os
import socketif __name__ == '__main__':socket = socket.socket()  # 生成socket对象socket.bind(("127.0.0.1", 8089))  # 绑定IP和端口socket.listen()  # 监听path = os.path.dirname(__file__) + "/lizi.html"//读取文件 存储在str变量f = open(path, encoding="utf-8")str = ''for line in iter(f):  # 迭代遍历str += lineconn, addr = socket.accept()  # 获取连接 -- 阻塞方法data = conn.recv(1024 * 8)  # 接收客户端数据conn.send(b"HTTP/1.0 200\r\n")  # 响应头conn.send(b"\r\n")  # 空行conn.send(str.encode())  # 响应数据print(data)socket.close()conn.close()
复制代码

如果要告诉浏览器这是html ,需要一个响应头 : content-type:text/html; charset=utf-8
就这么简单,然后一个页面就能被浏览器渲染了,所以说一个网站运行起来倒不是什么费劲的事,但优化是要来老命...

...
conn.send(b"HTTP/1.0 200\r\n")  # 响应头
conn.send(b"content-type:text/html; charset=utf-8\r\n")  # 响应头
conn.send(b"\r\n")  # 空行
conn.send(str.encode())  # 响应数据
...
复制代码

3.根据url来控制显示文字

lizi.html 是静态界面,如何实现动态效果? 服务端可以对静态界面进行加工再返还给服务端

import os
import socket
if __name__ == '__main__':socket = socket.socket()  # 生成socket对象socket.bind(("127.0.0.1", 8089))  # 绑定IP和端口socket.listen()  # 监听path = os.path.dirname(__file__) + "/lizi.html"f = open(path, encoding="utf-8")res = ''for line in iter(f):  # 迭代遍历res += lineconn, addr = socket.accept()  # 获取连接 -- 阻塞方法data = conn.recv(1024 * 8)  # 接收客户端数据# 服务器对客户端的请求数据进行加工,控制转换后发送给客户端data = str(data, encoding="utf-8")li = data.split("\r\n")firstLine = li[0]liFirstLine = firstLine.split(" ")param = liFirstLine[1].replace("/", '')res = res.replace("张风捷特烈", param)conn.send(b"HTTP/1.0 200\r\n")  # 响应头conn.send(b"content-type:text/html; charset=utf-8\r\n")  # 响应头conn.send(b"\r\n")  # 空行conn.send(res.encode())  # 响应数据socket.close()conn.close()
复制代码

二、服务小框架

如果说上面的是远古时期的时期时代,只能用打磨的石头当武器,随着社会发展,冷兵器也将到来
python服务端的框架就相当于刀剑的江湖

1.python自带的模块:wsgiref

负责与客户端的socket通信,用起来比自己写的爽一些

import os
from wsgiref.simple_server import make_server
def readfile(path):with open(path, "rb") as f:return f.read()def lizi(src):path = os.path.dirname(__file__) + srcreturn readfile(path)def runServer(evn, rep):rep('200 OK', [('Content-Type', 'text/html; charset=utf-8')])url = evn['PATH_INFO']return [lizi(url)] # 注意这里返回列表...掉坑了if __name__ == '__main__':httpd = make_server('127.0.0.1', 8089, runServer)httpd.serve_forever()
复制代码

2.关于Python和IDEA

也许是python版本换了之后弄的挺乱,pip装的包竟然IDEA竟然找不到...
看一下Python的配置classpath 里有好多东西,删了会怎样?


  • 然后我就全删了

结果print 函数都飘红了,神奇的是一点击能正常运行。也就是 classpath 里找不到print 函数
但Python运行环境还是在那的,虽然飘红但能运行。怎么让它不飘红 classpath 加回去呗


  • 添加stdlib的classpath

  • 如果现在使用外来包会怎么样

拿Jinja2来看,首先确保安装了它

J:\Python>pip freeze
cycler==0.10.0
Django==2.1.7
et-xmlfile==1.0.1
jdcal==1.4
Jinja2==2.10
...
复制代码

3. jinja2的使用

还是飘红但能用

---->[net\date.html]---------模板-------
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>now time :{{time}}<ul>{% for name in names %}<li>{{name}}</li>{% endfor %}
</ul>
</body>
</html>---->[net\ServerLever5.py]---------服务代码-------
import time
from jinja2 import Template
from wsgiref.simple_server import make_serverdef date():with open('date.html', "r") as f:res = f.read()tpl = Template(res)dest = tpl.render({"time": getTime(), "names": ["捷特", "龙少", "巫缨"]})return [bytes(dest, encoding="utf8")]def getTime():now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))return nowdef runServer(evn, rep):rep('200 OK', [('Content-Type', 'text/html; charset=utf-8')])return date() if __name__ == '__main__':httpd = make_server('127.0.0.1', 8089, runServer)httpd.serve_forever()
复制代码

4.解决方法

飘红看起来碍眼,而且没提示,怎么办?
查看H:\\PythonDK\\lib\\site-packages 将他加到classpath

|--- 查看python文件夹J:\Python>python -m sitesys.path = ['J:\\Python','H:\\PythonDK\\python37.zip','H:\\PythonDK\\DLLs','H:\\PythonDK\\lib','H:\\PythonDK','H:\\PythonDK\\lib\\site-packages',
]
USER_BASE: 'C:\\Users\\Administrator\\AppData\\Roaming\\Python' (doesn't exist)
USER_SITE: 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python37\\site-packages' (doesn't exist)
ENABLE_USER_SITE: True
复制代码

OK 不飘红,有提示,能运行 继续开心地敲代码吧,如果哪飘红就找找classpath在哪


三、django框架

1.安装框架:django

安装依赖 pip3 install django

J:\Python\NetAll>pip3 install django
Collecting djangoDownloading https://files.pythonhosted.org/packages/c7/87/fbd666c4f87591ae25b7bb374298e8629816e87193c4099d3608ef11fab9/Django-2.1.7-py3-none-any.whl (7.3MB)100% |████████████████████████████████| 7.3MB 521kB/s
Requirement already satisfied: pytz in h:\pythondk\lib\site-packages (from django) (2018.9)
Installing collected packages: django
Successfully installed django-2.1.7|--- 控制行 ( 如果错误:配置环境变量 python目录\Scripts )
C:\Users\Administrator>django-adminType 'django-admin help <subcommand>' for help on a specific subcommand.
Available subcommands:
[django]checkcompilemessagescreatecachetabledbshelldiffsettingsdumpdataflushinspectdbloaddatamakemessagesmakemigrationsmigraterunserversendtestemailshellshowmigrationssqlflushsqlmigratesqlsequenceresetsquashmigrationsstartappstartprojecttesttestserver
复制代码

2.创建一个项目
django-admin startproject toly_web
复制代码

3.最简单的两个页面

先直接在urls.py里测试一下django的作用, 开启服务:python manage.py runserver 8000

---->[toly_web/urls.py]--------------------
from django.shortcuts import HttpResponse
from django.urls import pathdef lizi(req):  # req--请求的封装对象return HttpResponse("Hello World From Server -- lizi")
def toly(req):  # req--请求的封装对象return HttpResponse("Hello World From Server -- toly")# 路径和函数的映射集
urlpatterns = [path('toly/', toly),path('lizi/', lizi),
]
复制代码

4.返回html页面

这里新建一个templates文件夹盛放html页面

def readfile(path):with open("./templates/" + path, "r", encoding="utf-8") as f:return f.read()def lizi(req):  # req--请求的封装对象return HttpResponse(readfile('lizi.html'))
复制代码

5.配置templates文件夹

当然上那样写也可以,不过不方便,还要自己读文件,settings中有TEMPLATES文件夹的设置
配置一下就可以用django内置的文件渲染函数

---->[toly_web/settings.py]-------------------------------
# 模板相关
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],  # 修改模板的路径'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]
复制代码
  • 使用起来很简单
from django.shortcuts import HttpResponse, renderdef lizi(req):  # req--请求的封装对象return render(req, 'lizi.html')
复制代码

6.django中使用静态文件

由于Html需要引入静态文件(js,css,图片,文件等),最好也配置一个静态文件的文件夹
springboot,react等框架,一般来说都是static文件夹盛放静态文件,这个没必要标新立异...

---->[toly_web/settings.py]-------------------------------
STATIC_URL = '/static/' # 引用静态文件是的开头部分STATICFILES_DIRS=[ # 指定文件夹名称os.path.join(BASE_DIR, 'static')
]
复制代码

7.分文件处理

也就是将处理逻辑和url分文件写,控制职责

---->[toly_web/urls.py]--------------------------
from django.urls import path
from toly_web.pagers import toly, lizi, photo# 路径和函数的映射集
urlpatterns = [path('toly/', toly),path('lizi/', lizi),path('photo/', photo),
]---->[toly_web/pagers.py]--------------------------
from django.shortcuts import HttpResponse, renderdef readfile(path):with open("./templates/" + path, "r", encoding="utf-8") as f:return f.read()def lizi(req):  # req--请求的封装对象return HttpResponse(readfile('lizi.html'))def photo(req):  # req--请求的封装对象return render(req, 'photo.html')def toly(req):  # req--请求的封装对象return HttpResponse("Hello World From Server -- toly")
复制代码

简单来说django帮我们解决了客户端和服务端的通信问题,和服务端的开启为题
我们需要关注的是业务的处理逻辑和路径的指定,网络访问框架基本都是这个套路


四、django中的表单和App

1.做一个注册页面

代码就不贴了,不想写样式的弄四个框也行

|--- url 指向 : http://127.0.0.1:8000/register/
|--- 提交跳转路径 :http://127.0.0.1:8000/add_user/
复制代码

会出现下面的错误,将setting的这句话注释起来即可


2.响应的方法add_user

如何获取用户的输入数据

def add_user(req):post = req.POSTprint(post)return HttpResponse(post)|--- 结果是一个QueryDict
<QueryDict: {'username': ['toly'], 'email': ['1981462002@qq.com'], 'pwd': ['123'], 'pwd_conform': ['123']}>|---  获取用户输入数据 -------------------------------
from django.http import HttpResponse
def add_user(req):post = req.POSTprint(post)username = req.POST.get('username', None)email = req.POST.get('email', None)pwd = req.POST.get('pwd', None)pwd_conform = req.POST.get('pwd_conform', None)res = ' username= ' + username + ' \r\nemail= ' + email + ' \r\npwd= ' + pwd + '\r\npwd_conform=' + pwd_conformreturn HttpResponse(res)
复制代码

3.字符占位 与重定向

django和 jinja2里的用法差不多 :html里-- {{变量名}} 使用,如下

def add_user(req):post = req.POSTprint(post)username = req.POST.get('username', None)email = req.POST.get('email', None)pwd = req.POST.get('pwd', None)pwd_conform = req.POST.get('pwd_conform', None)if pwd == pwd_conform:# return render(req, "photo.html")return redirect("/photo") # 重定向else:return render(req, "register.html", {'err': "两次密码不一致", "username": username, "email": email})复制代码
  • 服务失败
  • 服务成功

4.创建App

做安卓的对app的理解会深很多
记得末尾不要加; --- MySQL敲多了容易敲错...

python manage.py startapp IGallery
复制代码

5.配置app

相当于安装吧...

# Application definition
# app 相关配置 --- 安装--------------
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','IGallery.apps.IgalleryConfig', # 全类名
]
复制代码

6.使用app

将页面放入相应资源中,在views里写函数

---->[IGallery/views.py]-------------------------------
from django.shortcuts import renderdef gallery(req): return render(req, '3dg.html')|-- 添加路由 -------------
from IGallery import views
path('gallery/', views.gallery),
复制代码

五、django 的 ORM 操作

1.重点来了,要玩数据库了

ORM Object Relational Mapping 感觉有点MyBatis的感觉

# settings配置 数据库相关
DATABASES = {'default': {# 'ENGINE': 'django.db.backends.sqlite3', # 哇,sqlite3# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),'ENGINE': 'django.db.backends.mysql',  # 用mysql'HOST': '127.0.0.1',  # ip'PORT': '3306',  # 端口'NAME': 'datatype',  # 数据库名'USER': 'root',  # 用户名'PASSWORD': 'xxxxxx',  # 密码}
}
复制代码

2.连接数据库 : 安装 pymysql
---->[toly_web/__init__.py]-----------------
import pymysql
# 用pymysql代替MySQLdb
pymysql.install_as_MySQLdb()
复制代码

3.创建表
---->[IGallery/models.py]---------------创建实体类-----------
class PicUser(models.Model):id = models.AutoField(primary_key=True)  # 自增长主键username = models.CharField(null=False, max_length=20)  # 非空用户名password = models.CharField(null=False, max_length=24)  # 非空密码|--- 执行命令 ---------------------校验改动--------------
J:\Python\toly_web>python manage.py makemigrations
Migrations for 'IGallery':IGallery\migrations\0001_initial.py- Create model PicUser|--- 执行命令 ---------------------执行改动---------------
J:\Python\toly_web>python manage.py migrate
Operations to perform:Apply all migrations: IGallery, admin, auth, contenttypes, sessions
Running migrations:Applying IGallery.0001_initial... OKApplying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying sessions.0001_initial... OK|--- mysql查看创建的表 ---------------------------
mysql> SHOW TABLES;
+----------------------------+
| Tables_in_datatype         |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| igallery_picuser           |
+----------------------------+mysql> DESC igallery_picuser;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(20) | NO   |     | NULL    |                |
| password | varchar(24) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
复制代码

4.插入数据

还用刚才的注册表单

def add_user(req):...if pwd == pwd_conform:PicUser.objects.create(username=username, password=pwd)  # 插入数据...else:...
复制代码

5.获取数据
def list_user(req):res = PicUser.objects.all()  # 获取对象 [o1,o2,03]return render(req, "user_list.html", {"user_list": res})|--- html 表格 --------------------------
<div class="container">
<table  class="table table-striped table-bordered col-sm-8"><thead><tr><th>id值</th><th>用户名</th><th>密码</th></tr></thead><tbody>{% for user in user_list %}<tr><td>{{ user.id }}</td><td>{{ user.username }}</td><td>{{ user.password }}</td></tr>{% endfor %}</tbody>
</table>
复制代码

OK ,本文挺杂乱的,基本的服务端框架也就这样,PHP , Java的SpringBoot ,React ,Vue
核心都是模板填充数据,或只提供数据服务,整体梳理一下,细节方面,再说...

Python 网络服务相关 杂记相关推荐

  1. linux环境下和网络服务相关的配置文件含义及如何配置

    要建立一个安全Linux服务器就首先要了解Linux环境下和网络服务相关的配置文件的含义及如何进行安全的配置.那天查看服务器的eth0地址,后来想了一些问题,到家里就翻了翻以前的文档,无意中看到了这个 ...

  2. python网络开发框架_greenev首页、文档和下载 - Python网络服务框架 - OSCHINA - 中文开源技术交流社区...

    greenev是一个基于greenlet协程,事件驱动,非阻塞socket模型的Python网络服务框架,它使得可以编写同步的代码,却得到异步执行的优点.reactor模式采用基于epoll, kqu ...

  3. Linux与网络服务(一)网络服务相关概念通俗解释(科普向)

    Linux与网络服务(一)网络服务相关概念通俗解释(科普向) 前言 专业名词及概念的通俗解释 云服务器 云/云服务 云计算 弹性伸缩 负载均衡 公网IP 域名/域名备案 端口 SSH(安全外壳协议)/ ...

  4. Python网络爬虫简介与环境配置

    第一章 Python网络爬虫简介与环境配置 1.1 网络爬虫简介 随着互联网的快速发展越来越多的信息被发布到互联网上,这些信息被嵌入到各种各样的网页结构及样式中.虽然搜索引擎可以辅助用户搜索这些网页信 ...

  5. Python数据分析高薪实战第十二天 网络服务用户流失预测分析和国产电视剧评分预测分析

    29 综合实战:网络服务用户流失预测与分析 绝大多数互联网公司都面临一个非常重要的问题:用户流失问题.随着互联网和移动互联网的充分发展,发展新用户(也就是一般所说的拉新)的成本越来越高,往往要几块或者 ...

  6. python模块介绍- SocketServer 网络服务框架

    转载自http://my.oschina.net/u/1433482/blog/190612 摘要 SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServer, ...

  7. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  8. Windows 服务介绍(本地系统、网络服务、本地服务以及相关的power shell命令

    一.Windows服务概述 服务与进程 Windows服务是指系统自动完成的,不需要和用户交互的过程,可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何 ...

  9. Python网络编程——客户端与服务端简单信息发送与接受

    python网络编程-服务端与客户端简单信息发送与接受 思考一下我们进行网络中信息通信都需要什么或者说需要具备什么条件才能进行网络通信? 首先我们需要知道给谁发送,也就是目标机是谁,然后我们需要知道对 ...

最新文章

  1. 直接通过Binder的onTransact完成跨进程通信
  2. C Primer Plus_第8章_字符输入输出和输入确认_编程练习
  3. java合并整形_java中2个int合并成一个long
  4. JAVA线程并发数量控制_线程同步工具(二)控制并发访问多个资源
  5. Mac下运行git报错xcrun: error: invalid active developer path ..
  6. 华为机试HJ24:合唱队
  7. python适合自学编程吗-对没有编程基础的人来说,直接学Python入门IT合适吗?
  8. ios的Navigation Controller的学习使用
  9. 在线Excel:SpreadJS 15.0 中文版
  10. IDEA从零到精通(34)之IDEA 强大的文件对比功能
  11. 怎么在电脑的右键新建菜单添加.py或者其他格式的文件
  12. 【视频】海康摄像头、NVR网络协议简介
  13. 菜鸟初学JQuery
  14. 和大于等于target的最短子数组 | 循序递进---@二十一画
  15. summernote图片上传
  16. 老梦毕设学习平台设计——Home设计
  17. 计算机的外围设备简介
  18. PAT(乙级)1076.Wifi密码(15)
  19. c语言表达式判断,[判断C语言算术表达式的合法性]
  20. 07_plantform平台总线

热门文章

  1. Oracle计算两个整数的和与这两个整数的差与商
  2. ImageView 缩放
  3. Office Tab免费版:标签化浏览和编辑Office文档
  4. websocket python爬虫_python实现基于websocket协议的网络爬虫
  5. 阿里用回mysql_回mysql方式
  6. 分治递归逆序数_[模板] 归并排序 逆序数 分治
  7. centos6 安装 mantisbt-1.2.8 —— (5)Mantisbt-1.2.8在contos上的安装
  8. bzoj3993 [SDOI2015]星际战争
  9. laravel中token的使用方式
  10. batch 批处理获取系统时间