django 初识

一、手撸web框架

推导框架的演变过程,思路是重点

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模块

wsgiref 是 Python 的标准库模块之一,它提供了对WSGI(Web Server Gateway Interface)规范的实现。

WSGI是一种Web应用程序和Web服务器之间通信的规范,它允许开发人员在Python中编写可移植的Web应用程序,并与不同的Web服务器进行交互,而无需关注特定服务器的细节。

wsgiref 主要包含两个重要的子模块:

  1. wsgiref.simple_server:这个子模块提供了一个简单的WSGI服务器,允许你在开发阶段快速测试和调试你的WSGI应用程序。你可以使用 make_server 函数创建一个WSGI服务器,并将你的应用程序传递给它。

  2. 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主流的框架

  1. Flask:Flask 是一个轻量级的微框架,简单易学,适用于小型应用和快速原型开发。它具有灵活的扩展性,你可以根据需要选择添加功能。Flask 不内置数据库或表单验证等功能,但可以通过插件添加。

  2. Django:Django 是一个功能强大的全栈 Web 框架,内置了许多功能,包括ORM(对象关系映射)、表单验证、自动化Admin后台、用户认证等。它适用于中大型Web应用和企业级项目。

  3. FastAPI:FastAPI 是一个现代的、高性能的Web框架,专为构建API而设计。它基于Python 3.6+ 的类型提示和异步支持,使得开发速度快,性能卓越。FastAPI 提供了自动生成API文档的功能,使得编写API文档变得简单。

  4. Pyramid:Pyramid 是一个灵活且高度可定制的Web框架,它允许开发人员根据项目的需求自由选择和组合组件。Pyramid 的设计理念是“不做过多假设”,这使得它适用于各种类型的应用,从小型应用到大型企业应用。

  5. Tornado:Tornado 是一个异步的网络框架,适用于构建高性能和可伸缩的应用。它最初是为了解决高并发问题而开发的,特别适用于实时Web应用和长连接。Tornado 支持异步编程,使得它在处理大量并发连接时表现出色。

这只是一小部分主流的 Python Web 框架,还有其他优秀的框架可供选择,如Bottle、CherryPy、web2py等。选择适合你项目需求的框架是很重要的,不同框架适用于不同规模和类型的应用。因此,在选择之前,建议你对每个框架进行更详细的研究和了解,以确保最好地满足项目需求。

2、Django版本

  1. Django 1.x 系列:最早的 Django 版本,包含了许多基本功能。其中 Django 1.11 是支持最久的版本,提供了长期支持(LTS)。

  2. Django 2.x 系列:这个版本引入了一些重要的变化,包括 Python 3.5 及以上的支持,去除了一些废弃的功能,并改进了性能。

  3. Django 3.x 系列:Django 3.0 在 2019 年发布,它在前一版本的基础上进一步改进了功能和性能,并且开始不再支持 Python 2。

  4. 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 对象上常用的属性和方法:

  1. request.method: 获取当前请求的 HTTP 方法,如 'GET' 或 'POST'。
  2. request.GET: 包含通过 URL 查询字符串传递的参数的字典。
  3. request.POST: 包含通过 POST 方法传递的参数的字典。
  4. request.FILES: 包含通过请求上传的文件的字典。
  5. request.COOKIES: 包含所有的 Cookie 的字典。
  6. request.session: 与当前会话相关联的会话对象。
  7. 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/')

  

 

posted @ 2023-07-26 15:46  凡人半睁眼  阅读(14)  评论(0编辑  收藏  举报