Python之Web框架Django

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Python之Web框架Django

官网

https://www.djangoproject.com/download/

安装django

pip安装django

# 查看python版本,版本显示如下Python 3.12.1
python3 -V
# 安装django
python3 -m pip install Django==5.0.6
# 查看django版本
python3 -m django --version

通过Django包离线安装

下载Django项目并解压

进入 Django 目录,执行 python3 setup.py install,然后开始安装,Django 将要被安装到 Python 的 Lib下site-packages。

python3 setup.py install

安装成功后python的lib下面的django文件

检查是否安装成功

import django
django.get_version()

创建项目

# 通过django-admin startproject命令创建项目
django-admin startproject testdj
cd testdj # 切换到创建的项目
#运行项目
python3 manage.py runserver
#0.0.0.0让其它电脑可连接到开发服务器,8000为端口号。如果不说明,端口号默认为8000。
python3 manage.py runserver 0.0.0.0:8000

浏览器访问http://127.0.0.1:8000/

查看项目的结构

创建登陆账号

python3 manage.py createsuperuser

http://127.0.0.1:8000/admin/ ,打开此网页登陆账号

接口及URL映射配置

新建一个views.py文件

from django.http import HttpResponse
def hello(request):
    return HttpResponse("Hello world ! ")

打开 urls.py 文件,绑定 URL 与视图函数。

path('hello/', views.hello)

template模版

settings.py设置模板文件夹位置

修改settings.py文件,TEMPLATES的 DIRS 为 [os.path.join(BASE_DIR, 'templates')]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],       # 模版位置,根目录下的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',
            ],
        },
    },
]

index.html

在根目录的templates文件夹下新建index.html文件

<h1>{{ hello }}</h1>

接口返回渲染的界面

from django.http import HttpResponse
from django.shortcuts import render
def hello(request):
    return HttpResponse("Hello world ! ")
# 渲用模版染index.html
def helloTemplate(request):
    context = {}
    context['hello'] = 'Hello World!'
    return render(request, 'index.html', context)
path('helloTemp/', views.helloTemplate)

测试

http://127.0.0.1:8000/helloTemp/

模版进阶

接口渲染变量,列表,字典三种数据类型

from django.http import HttpResponse
from django.shortcuts import render
def hello(request):
    return HttpResponse("Hello world ! ")
# 渲用模版染index.html
def helloTemplate(request):
    # 定义字典,因为render的第三个参数事通过字典的键值对来渲染html界面的
    context = {}
    #渲染变量
    context['hello'] = 'Hello World!'
    # 渲染列表
    context['hello_list'] = ["葬送的芙莉莲","辛尔美","菲伦"]
    # 渲染字典
    context['hello_dict'] = {"name":"芙莉莲","age":1000}
    # 等同于return render(request,"index.html", {"hello":'Hello World!'})
    return render(request, 'index.html', context)

html

<h1>{{ hello }}</h1>
<!-- 取出整个列表 -->
<p>{{ hello_list }}</p>  
<!-- 取出列表的第一个元素  -->
<p>{{ hello_list.0 }}</p>
<!-- 取整个字典 -->
<p>{{ hello_dict }}</p>
<!-- 取字典的某个key的值 -->
<p>{{ hello_dict.name }}</p>

过滤器

<!-- 语法 -->
{{ 变量名 | 过滤器:可选参数 }}
<!-- 过滤器 lower 处理后,转换为小写 -->
{{ name|lower }}
<!-- 第一个元素并将其转化为大写;过滤管道可以被套接,一个过滤器管道的输出又可以作为下一个管道的输入 -->
{{ my_list|first|upper }}
<!-- 显示变量 bio 的前30个词 -->
{{ bio|truncatewords:"30" }}
<!-- 添加反斜杠到任何反斜杠、单引号或者双引号前面 -->
{{ name|addslashes }}
<!--  按指定的格式字符串参数格式化 date 或者 datetime 对象 -->
{{ time|date:"Y-m-d" }}
<!-- default 为变量提供一个默认值 -->
{{ name|default:"这是默认值" }}
<!-- 返回对象的长度,适用于字符串和列表。字典返回的是键值对的数量,集合返回的是去重后的长度 -->
{{ name|length}}
<!-- safe将字符串标记为安全,不需要转义。返回的url为超链接时使用 -->
{{ views_str|safe }}
<!-- 选择结构 -->
{%if num > 90 and num <= 100 %}
    优秀
{% elif num > 60 and num <= 90 %}
    合格
{% else %}
    去玩吧~
{% endif %}
<!-- ifequal/ifnotequal 标签 -->
{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% else %}
    <h1>No News Here</h1>
{% endifequal %}
<!-- 循环结构 ,后面加reversed代表反向迭代
在 {% for %} 标签里可以通过 {{forloop}} 变量获取循环序号。
forloop.counter: 顺序获取循环序号,从 1 开始计算
forloop.counter0: 顺序获取循环序号,从 0 开始计算
forloop.revcounter: 倒序获取循环序号,结尾序号为 1
forloop.revcounter0: 倒序获取循环序号,结尾序号为 0
forloop.first(一般配合if标签使用): 第一条数据返回 True,其他数据返回 False
forloop.last(一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False 
-->
{% for item in views_list %}
    {{ item }}
    {{ forloop.counter }}
    {{ forloop.counter0 }}
    {{ forloop.revcounter }}
    {{ forloop.revcounter0 }}
    {{ forloop.first }}
    {{ forloop.last }}
{% endfor %}
<!-- 遍历字典 -->
{% for key,val in views_dict.items %}
    {{ key }}---{{ val }}
{% endfor %}
<!-- 可选的 {% empty %} 从句:在循环为空的时候执行(即 in 后面的参数布尔值为 False )。 -->
{% for i in listvar %}
    {{ forloop.counter0 }}
{% empty %}
    空空如也~
{% endfor %}
<!-- Django 注释使用 {# #} -->
{# 这是一个注释 #}
<!-- {% include %} 标签允许在模板中包含其它的模板的内容 -->
{% include "nav.html" %}
<!-- csrf_token 用于form表单中,作用是跨站请求伪造保护。
如果不用 {% csrf_token %} 标签,在用 form 表单时,要再次跳转页面会报 403 权限错误。
用了{% csrf_token %} 标签,在 form 表单提交数据时,才会成功。 -->

自定义标签和过滤器

在 templatetags 目录下创建my_tags.py文件

from django import template
from django.utils.safestring import mark_safe
register = template.Library()   #register的名字是固定的,不可改变
# 用装饰器 @register.filter 自定义过滤器,装饰器的参数最多只能有 2 个
@register.filter
def my_filter(v1, v2):
    return v1 * v2
# 用装饰器 @register.simple_tag 自定义标签
@register.simple_tag
def my_tag1(v1, v2, v3):
    return v1 * v2 * v3
# 定义标签时,用上 mark_safe 方法,令标签语义化
@register.simple_tag
def my_html(v1, v2):
    temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)
    return mark_safe(temp_html)

index.html中使用

<!-- 自定义过滤器 -->
{{ 11|my_filter:22 }}
<!-- 自定义标签 -->
{% my_tag1 11 22 33 %}
<!-- HTML中使用自定义标签,在页面中动态创建标签 -->
{% my_html "zzz" "xxx" %}

配置静态文件

settings 文件的最下方配置添加配置,在项目根目录下创建 statics 目录.在 statics 目录下创建 css 目录,js 目录,images 目录,plugins 目录, 分别放 css文件,js文件,图片,插件。把 bootstrap等前端框架放入插件目录 plugins。

注意:此时引用路径中的要用配置文件中的别名 static,而不是目录 statics

STATIC_URL = '/static/' # 别名 
STATICFILES_DIRS = [ 
    os.path.join(BASE_DIR, "statics"), 
]

在html中

{% load static %}
<img src="{% static 'img/logo.png' %}" alt="logo">

模板继承

模板可以用继承的方式来实现复用,减少冗余内容。

网页的头部和尾部内容一般都是一致的,我们就可以通过模板继承来实现复用。

父模板用于放置可重复利用的内容,子模板继承父模板的内容,并放置自己的内容。

父模板

标签 block...endblock: 父模板中的预留区域,该区域留给子模板填充差异性的内容,不同预留区域名字不能相同。

{% block 名称 %} 
预留给子模板的区域,可以设置设置默认内容
{% endblock 名称 %}

base.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Home Page</title>
</head>
<body>
    <h1>Hello World!</h1>
    <p>Django 测试</p>
    {% block mainbody %}
       <p>base会被子模版覆盖</p>
    {% endblock %}
</body>
</html>

子模板

子模板使用标签 extends 继承父模板:

{% extends "父模板路径"%}

子模板如果没有设置父模板预留区域的内容,则使用在父模板设置的默认内容,当然也可以都不设置,就为空。

子模板设置父模板预留区域的内容:

{ % block 名称 % }
内容
{% endblock 名称 %}

child.html

{%extends "base.html" %}
 
{% block mainbody %}
<p>继承了 base.html 文件</p>
{% endblock %}

Django 模型

Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

sudo pip3 install pymysql

Django ORM

Django 模型使用自带的 ORM。

对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当桥梁的作用。ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

ORM优点:

提高开发效率。

不同数据库可以平滑切换。

ORM缺点:

ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。

长期写 ORM 代码,会降低编写 SQL 语句的能力。

ORM 解析过程:

1、ORM 会将 Python 代码转成为 SQL 语句。

2、SQL 语句通过 pymysql 传送到数据库服务端。

3、在数据库中执行 SQL 语句并将结果返回。

数据库配置

settings.py 文件中找到 DATABASES 配置项,将其信息修改为

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': BASE_DIR / 'db.sqlite3',
#     }
# }
DATABASES = { 
    'default': 
    { 
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'autumn', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 
        'PORT': 3306, # 端口 
        'USER': 'autumn',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }  
}

# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置 
import pymysql
pymysql.install_as_MySQLdb()

创建Model

django-admin startapp UserModel

from django.db import models
class User(models.Model):
    name = models.CharField(max_length=20)

类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
39 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
1天前
|
Python
使用Python和Flask构建简单的Web应用
使用Python和Flask构建简单的Web应用
13 6
|
1天前
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
14 6
|
2天前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
9 5
|
4天前
|
安全 Python
使用Python实现简单的Web服务器
使用Python实现简单的Web服务器
15 6
|
13天前
|
Web App开发 数据采集 iOS开发
「Python+Dash快速web应用开发」
这是「Python+Dash快速web应用开发」系列教程的第十六期,本期将介绍如何在Dash应用中实现多页面路由功能。通过使用`Location()`组件监听URL变化,并结合回调函数动态渲染不同页面内容,使应用更加模块化和易用。教程包括基础用法、页面重定向及无缝跳转等技巧,并通过实例演示如何构建个人博客网站。
22 2
WK
|
10天前
|
数据采集 API 开发者
很少有人用python开发web???
Python 是一种流行且广泛使用的编程语言,尤其在 Web 开发领域。它凭借简洁的语法、丰富的框架(如 Django 和 Flask)、强大的库支持及活跃的社区,成为许多开发者和企业的首选。Python 的易学性、高效性及广泛的应用场景(包括 Web API、微服务和数据分析等)使其在 Web 开发中占据重要地位,并将持续发挥更大作用。
WK
34 0
|
14天前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
24 0
|
14天前
|
Java 缓存 数据库连接
揭秘!Struts 2性能翻倍的秘诀:不可思议的优化技巧大公开
【8月更文挑战第31天】《Struts 2性能优化技巧》介绍了提升Struts 2 Web应用响应速度的关键策略,包括减少配置开销、优化Action处理、合理使用拦截器、精简标签库使用、改进数据访问方式、利用缓存机制以及浏览器与网络层面的优化。通过实施这些技巧,如懒加载配置、异步请求处理、高效数据库连接管理和启用GZIP压缩等,可显著提高应用性能,为用户提供更快的体验。性能优化需根据实际场景持续调整。
40 0
|
14天前
|
Java 数据库连接 Spring
Struts 2 插件开发竟如魔法盛宴,为框架注入超能力,开启奇幻编程之旅!
【8月更文挑战第31天】在Web开发中,Struts 2插件开发允许我们在不改动框架核心代码的前提下,通过创建实现特定接口的Java类来扩展框架功能、调整其行为或促进与其他框架(如Spring、Hibernate)的集成,从而更好地满足特定业务需求。遵循良好的设计原则与实践,能够确保插件的高效稳定运行并提升整体项目的可维护性。具体步骤包括创建项目、定义插件类、实现初始化与销毁逻辑,并将插件部署至应用中。
37 0