django 初识
一、
1、写一个服务端
import socket server = socket.socket() server.bind(('127.0.0.1', 9000)) server.listen(3) while True: conn, addr = server.accept() data = conn.recv(1024) print(data.decode('utf8')) conn.send(b'HTTP//1.1 200 OK \r\n\r\n') conn.send(b'hello django!') conn.close()
注意: conn.send(b'HTTP//1.1 200 OK \r\n\r\n') tcp的流式协议,注意是两个\r\n\r\n
2、在浏览器地址栏中写什么后缀就返回什么内容?
一次正常的访问,后端会收到2个GET请求,第一个GET后面为浏览器端输入的后缀,第二个为/favicon.ico 网站图标
<link rel="icon" href="favicon.ico" type="image/x-icon">
GET /login HTTP/1.1 Host: 127.0.0.1:9000 Connection: keep-alive sec-ch-ua: "Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114" ..... Accept-Language: zh-CN,zh;q=0.9 GET /favicon.ico HTTP/1.1 Host: 127.0.0.1:9000 Connection: keep-alive sec-ch-ua: "Not.A/Brand";v="8", "Chromium";v="114", "Google .... Referer: http://127.0.0.1:9000/login Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9
从上可知想要拿到login需要做一个split、strip、判断等操作
import socket server = socket.socket() server.bind(('127.0.0.1', 9000)) server.listen(3) while True: conn, addr = server.accept() data = conn.recv(1024) # print(data.decode('utf8')) target = data.decode('utf8').split(' ')[1].strip('/') # print(target) conn.send(b'HTTP//1.1 200 OK\r\n\r\n') if target == 'login': conn.send(b'login') elif target == 'index': conn.send(b'index') else: conn.send(b'404 error!') conn.close()
3、
wsgiref
是 Python 的标准库模块之一,它提供了对WSGI(Web Server Gateway Interface)规范的实现。
WSGI是一种Web应用程序和Web服务器之间通信的规范,它允许开发人员在Python中编写可移植的Web应用程序,并与不同的Web服务器进行交互,而无需关注特定服务器的细节。
wsgiref
主要包含两个重要的子模块:
-
wsgiref.simple_server
:这个子模块提供了一个简单的WSGI服务器,允许你在开发阶段快速测试和调试你的WSGI应用程序。你可以使用make_server
函数创建一个WSGI服务器,并将你的应用程序传递给它。 -
wsgiref.util
:这个子模块提供了一些与WSGI相关的实用函数和类,帮助你处理HTTP头、查询字符串、Cookie等。
请注意,wsgiref
不是用于生产环境的完整Web服务器解决方案,而是作为一个简单的测试和调试工具。在实际部署时,你应该使用专业的Web服务器,如Gunicorn、uWSGI或Apache等,
from wsgiref.simple_server import make_server # 解决了socket部分不用我们写了,在wsgiref模块里人家帮我们写了 # 它解决了并发问题 WSGIServer类------>wsgiref------>它能够解决的并发量不高----->本地使用wsgiref服务器--------------->代码上线之后,就不是有它----------->uwsgi服务器(它支持的并发量更高) def run(env, response): """ :param env: 客户端每次发起请求的时候,所携带的数据都在这个里面,就类似属于是request :param response: 是后端给浏览器返回的数据 :return: 返回给浏览器查看的 """ print(env) response("200 OK", []) current_path = env.get('PATH_INFO') if current_path == '/index': return [b'index'] elif current_path == '/login': return [b'login'] else: return [b'404 error'] if __name__ == '__main__': server = make_server(host='127.0.0.1', port=8001, app=run) server.serve_forever()
二、Django 框架
1、python主流的框架
-
Flask:Flask 是一个轻量级的微框架,简单易学,适用于小型应用和快速原型开发。它具有灵活的扩展性,你可以根据需要选择添加功能。Flask 不内置数据库或表单验证等功能,但可以通过插件添加。
-
Django:Django 是一个功能强大的全栈 Web 框架,内置了许多功能,包括ORM(对象关系映射)、表单验证、自动化Admin后台、用户认证等。它适用于中大型Web应用和企业级项目。
-
FastAPI:FastAPI 是一个现代的、高性能的Web框架,专为构建API而设计。它基于Python 3.6+ 的类型提示和异步支持,使得开发速度快,性能卓越。FastAPI 提供了自动生成API文档的功能,使得编写API文档变得简单。
-
Pyramid:Pyramid 是一个灵活且高度可定制的Web框架,它允许开发人员根据项目的需求自由选择和组合组件。Pyramid 的设计理念是“不做过多假设”,这使得它适用于各种类型的应用,从小型应用到大型企业应用。
-
Tornado:Tornado 是一个异步的网络框架,适用于构建高性能和可伸缩的应用。它最初是为了解决高并发问题而开发的,特别适用于实时Web应用和长连接。Tornado 支持异步编程,使得它在处理大量并发连接时表现出色。
这只是一小部分主流的 Python Web 框架,还有其他优秀的框架可供选择,如Bottle、CherryPy、web2py等。选择适合你项目需求的框架是很重要的,不同框架适用于不同规模和类型的应用。因此,在选择之前,建议你对每个框架进行更详细的研究和了解,以确保最好地满足项目需求。
2、Django版本
-
Django 1.x 系列:最早的 Django 版本,包含了许多基本功能。其中 Django 1.11 是支持最久的版本,提供了长期支持(LTS)。
-
Django 2.x 系列:这个版本引入了一些重要的变化,包括 Python 3.5 及以上的支持,去除了一些废弃的功能,并改进了性能。
-
Django 3.x 系列:Django 3.0 在 2019 年发布,它在前一版本的基础上进一步改进了功能和性能,并且开始不再支持 Python 2。
-
Django 4.x 系列:Django 4.0 是最新版本,它在前一版本的基础上继续改进,并支持 Python 3.6 及以上版本。
3、安装Django
pip3.6 install django==1.11 或者 pycharm中安装
4、创建和启动 Django 项目
# 创建项目 django-admin startproject django_project # 启动项目 python3.6 manage.py runserver # 修改默认端口 python3 manage.py runserver 127.0.0.1 8001
注 :修改默认端口
settings.py
文件中,Django 提供了一个名为 ALLOWED_HOSTS
的设置,其中你可以指定允许的主机名或IP地址列表。
ALLOWED_HOSTS = ['127.0.0.1', 'your_custom_domain.com'] DEBUG = False PORT = 8001
补充:在pycharm中启动django项目
django 1.x版本:
5、 创建app应用
在配置文件中注册应用,这个应用才生效
python3.6 manage.py startapp app01(应用名)
6、注册应用
在 Django 项目的 settings.py
配置文件中,找到 INSTALLED_APPS
设置,将新创建的应用程序添加到其中。INSTALLED_APPS
是一个包含所有已注册应用名称的列表。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', # 全称 'app01', # 简称 ]
7、主要的配置文件介绍
myfirst_dj # 项目名称 app01 # 应用名称 migrations # 这个是用来存储数据库迁移记录 __init__.py admin.py # 跟后台项目注册等相关的 apps.py # 跟一些注册相关 models.py # 跟数据库打交道的 模型层----->MTV模型 tests.py # 测试文件 views.py # 视图文件,写一些后端逻辑 myfirst_dj __init__.py settings.py # 配置文件相关的 urls.py # 路由相关的 wsgi.py # 内部封装的wsgiref服务器,uwsgi服务器之后,这个文件就没用了uwsgi.py db.sqlite3 # Django自带的小型数据库 manage.py # Django框架的入口文件
三、django 小白三板斧
返回字符串、返回html文件、重定向网页
所有的视图函数不能够没有返回值,并且返回值还必须是HttpResponse对象(看源码)
1、返回字符串
定义app01的一个简单返回值
views.py文件相当于run文件,
from django.shortcuts import render def index(request): return None
在Django中,当你定义一个函数式视图(function-based view)时,比如def index(request):
,
request
参数表示一个 HTTP 请求对象。当用户访问相应的 URL 时,Django 会自动将这个请求对象传递给你定义的视图函数。
request
对象包含了关于传入的 HTTP 请求的信息,比如头部(headers)、参数(parameters)、Cookie、用户会话数据以及所使用的 HTTP 方法(GET、POST等)。
它允许你访问与当前请求相关的各种细节,并且能够对将要发送给客户端的响应进行操作。
以下是 request
对象上常用的属性和方法:
request.method
: 获取当前请求的 HTTP 方法,如 'GET' 或 'POST'。request.GET
: 包含通过 URL 查询字符串传递的参数的字典。request.POST
: 包含通过 POST 方法传递的参数的字典。request.FILES
: 包含通过请求上传的文件的字典。request.COOKIES
: 包含所有的 Cookie 的字典。request.session
: 与当前会话相关联的会话对象。request.user
: 表示当前经过身份验证的用户的对象。
通过使用 request
对象,你可以根据用户的请求做出相应的响应,比如从数据库中获取数据、处理表单提交、返回渲染后的网页等。
return 需要返回httpResponse,而不是None
使用HttpResponse模块返回字符串
from django.shortcuts import render, HttpResponse # Create your views here. def index(request): return HttpResponse('zjz 晚上好呀!')
补充:
HttpResponse
是 Django 框架中的一个类,用于构建和返回 HTTP 响应。
它允许开发人员在 Django 视图函数中返回动态内容,例如网页、JSON 数据、XML 数据或其他任何类型的数据,作为 HTTP 响应发送给客户端浏览器或应用程序。
2、返回一个html文件
手动创建的app01应用不会有templates文件夹,需要自己创建
pycharm创建的app01会自动生成templates文件夹
settings中 DIRS 用于拼接模版的路径
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR , 'templates']
修改后
'DIRS': [os.path.join(BASE_DIR , 'templates')]
templates文件夹下面存放 html 网页文件(这里直接复制jd html文件)
使用 render模块返回html网页
from django.shortcuts import render, HttpResponse # Create your views here. def index(request): # return HttpResponse('zjz 晚上好呀!') return render(request, 'js.html')
补充:
"render"(渲染)模块通常是指用于生成图像、文档、网页等可视化内容的库或工具。
3、返回一个重定向网页
Django 中,redirect
是一个常用的函数,用于执行HTTP重定向操作
from django.shortcuts import render, HttpResponse, redirect # Create your views here. def index(request): # return HttpResponse('zjz 晚上好呀!') # return render(request, 'js.html') return redirect('https://www.jd.com/')