Python编程:Django后端学习

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

入门基础

1、WEB框架

MVC  Model  View    Controller
     数据库 模板文件  业务处理
MTV  Model  Template   View
     数据库  模板文件  业务处理

2、Django

安装:pip3 install django

备注: 确认环境变量是否真确添加

# 1、创建项目:
      django-admin startproject mysite
      进入目录: cd mysite
      启动服务器:python manage.py runserver [217.0.0.1:8000(可选)]
    目录:
        mysite
            - mysite            # 对整个程序进行配置
                - __init__.py   #py3 里边可有可无,py包
                - settings.py   # 配置文件
                - url.py        # url对应关系
                - wsgi.py       # 遵循wsgi规范  uwsgi + nginx
            - manage.py         # 管理程序
                - python manage.py
    # 2、创建app:
    python manage.py startapp appname
    目录:
        blog
            - migrations  # 修改表结构记录
            - __init__    #
            - admin       # 后台管理
            - apps        # 配置当前app
            - models      # ORM 创建数据表
            - tests       # 单元测试
            - views       # 业务代码
   # 3、配置模板路径
        TEMPLATES  'DIRS': [os.path.join(BASE_DIR, 'templates')]
   # 4、配置静态文件路径
        STATIC_URL = '/static/'
        STATICFILES_DIRS = [
            os.path.join(BASE_DIR, "static"),
        ]
   # 5、seetings -> middlerware 注释csrf
   # 6、定义路由规则urls.py
   # 7、定义视图函数views.py
        request.method GET / POST
   # 8、模板渲染,模板语言

Django请求的生命周期:


  请求 -> 路由系统 -> 视图函数 -> 渲染返回render(templates + static + database)

备注:返回的是字符串


作业:
        sql 8列
        主机管理: ip port ...
        用户表: 用户名,密码
        功能:
            1.登陆
            2.主机管理页面
                - 查看所有的主机信息(4列)
                - 增加主机信息 模态对话框
            3.查看详情
            4.删除  确认对话框
        代码:mymanager

进阶内容

1、路由系统

url(正则) path(字符串)

# (1)路由匹配
    from django.urls import path       普通匹配
    from django.conf.urls import url   正则匹配
    实例:
    path("index", views.index)            处理函数
    path("index", views.Index.as_view())  处理类
# (2)带参路由
    正则匹配  位置参数接收
    ulr("^page-(\d+)-(\d+).html", views.page)  
    命名正则  关键字参数接收
    ulr("^page-(?P<uid>\d+)-(?P<nid>\d+).html", views.page)  
    视图函数接收方式:
    def page(request, uid, nid)
    def page(request, *args)
    def page(request, *kwargs)
    def page(request, *args, *kwargs)
# (3)路由分发
    include("app_name.urls")  一级路由 -> 二级路由
# (4)name参数 对url命名,便于生成url
    path('index', views.index, name="index"),
    url(r'detail-(\d+).html', views.detail, name="detail"),  # 正则
    url(r'page-(?P<uid>\d+)-(?P<nid>\d+).html', views.page, name="page"),
    # views视图中使用:
    from django.urls import reverse
    url1 = reverse("index")                               # index
    url2 = reverse("detail", args=(12))                   # detail/12
    url2 = reverse("page", kwargs={"uid": 12, "nid":13})  # page/12/13
   # 模板语言中使用:
    {% url "index" %}                # index
    {% url "detail" 12%}             # detail/12
    {% url "page" uid=12 nid=13 %}   # page/12/13
# (5)默认值
# (6)命名空间

2、视图


# 1、FBV  function base view  url -> function函数
        def index(request, *args, **kwargs):
            pass
# 2、CBV url -> class类
class Index(views.View):
    def get(self, request,  *args, **kwargs):
        pass
    def dispath():
        pass

数据交互


# 获取用户请求中的数据
        ?name=Tom&age=12
        name = request.GET.get("name", None)
        name = request.POST.get("name", None)
        request.GET.get()
        request.POST.get()
        request.FILES.get()
        checkbox等多选内容
        request.POST.getlist()
        request.path_info  显示当前url
# 文件对象
           obj = request.FILES.get()
           obj.name
           obj.size
           obj.chunks()
           # <form enctype="multipart/form-data"></form>
# 给用户返回数据:
        render(request, 模板文件路径, 字典)
        redirect("url")
        HttpResponse(字符串)
        # 返回字符串
        返回return HttpResponse("字符串")
        渲染模板:return render(request, "html文件", {"data": data})
        重定向:return redirect("url")

3、模板语言

render(request, "index.html", {"data", data})
    变量{{ variable }}
    列表取值 lst.index
    字典取值 dct.key
    for循环{% for row in data%}循环体{% endfor %}
    列表循环 for i in lst
    字典循环
        for key in dct;
        for key in dct.keys;
        for value in dct.values;
        for key, value in dct.items;
    条件 {% if age %}{% else %}{% endif %}
        大于> 小于< 等于==

4、ORM操作

code first # ok
db first
    #(1)创建类和字段models.py
        a.需要继承自 models.Model
        class User(models.Model):
            id = models.IntegerField()
            name = models.CharField(max_length=32) # 字段长度
        b.注册app
        settings 中配置INSTALLED_APPS  和  DATABASES
        c.执行命令(新建和更新)
        python manage.py makemigrations
        python manage.py migrate
        注意:
            django默认使用MySQLdb 链接mysql  2.0是不是修改了?
            主动修改为pymysql 在project 同名的__init__ 添加如下代码:
            import pymysql
            pymysql.install_as_MySQLdb()
    # (2)根据类对数据表中的数据进行操作
        models.UserInfo.objects.create(name="Jimi", age=24)
        obj = models.UserInfo(name="Tom", age=24)
        obj.save()
        dct = {"name": "Mike", "age": 24}
        models.UserInfo.objects.create(**dct)
        models.UserInfo.objects.filter(id=3).delete()
        models.UserInfo.objects.filter(id=4).update(age=25)
        dct = {"name": "Mike", "age": 24}
        models.UserInfo.objects.filter(id=4).update(**dct)
        select * from tb where id>1
        # 对应:
        models.tb.objects.filter(id=1)
        models.tb.objects.filter(id__gt=1)
        models.tb.objects.filter(id__lt=1)
        models.tb.objects.filter(id__gte=1)
        models.tb.objects.filter(id__lte=1)
        dct = {"username": "Mike", "id__gt": 2}
        models.tb.objects.filter(**dct)
        v1 = models.Business.objects.all()
        # QuerySet  内部是对象
        v2 = models.Business.objects.all().values("id", "caption")
        # QuerySet  内部是字典
        v3 = models.Business.objects.all().values_list("id", "caption")
        # QuerySet  内部是元组
        models.Business.objects.get()  # 获取对象,不存在报错
        lst = models.UserInfo.objects.all() 获取QuerySet对象
        dct = models.UserInfo.objects.filter().first()获取对象或者None

5、外键

class UserType(models.Model):
        caption = models.CharField(max_length=32)
    class User(models.Model):
        name = models.CharField(max_length=10)
        age = models.IntegerField()
        # user_type_id = models.IntegerField() # 约束
        user_type = models.ForeignKey("UserType", to_field="id")
    数据类型
        数字 字符串ChairField 时间 二进制
        AutoField(primary_key=True)  #重写自增字段
    参数字段
    null                是否可以为空
    db_column           列名
    db_tablespace
    default             数据库中字段的默认值
    primary_key         是否为主键
    db_index            是否建立索引
    unique              是否建立唯一索引
    unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
    unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
    unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
    auto_now            创建时,自动生成时间
    auto_now_add        更新时,自动更新为当前时间
        obj = models.UserInfo.object.filter().first()
        obj.caption = "CEO"
        obj.save()
    verbose_name        Admin中显示的字段名称
    blank               Admin中是否允许用户输入为空
    editable            Admin中是否可以编辑
    help_text           Admin中该字段的提示信息
    choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                        如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
    error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                        字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                        如:{'null': "不能为空.", 'invalid': '格式错误'}
    validators          自定义错误验证(列表类型),从而定制想要的验证规则
    admin
    创建后台用户:
    python manage.py createsuperuser
    一对多关系 外键 外键字段_id
    多对多关系

规则:

GET: 获取数据

POST: 提交数据


作业:用户管理

   1.用户组的增删改查

   2.用户的增删改查

       添加,修改,删除(需显示默认值,模态对话框)

   3.比较好看的页面

ajax

$.ajax({
        url:"/update",
        type:"post",
        data:$("#edit-form").serialize()
        //打包发送
     });

多对多关系

1、自定义关系表 建立第三张表


models.ForeignKey

2、自动创建关系表


r = models.ManyToManyField("tablename")
obj = Application.objects.get(id=1)
obj.name

操作第三张表

obj.r.add(1)
obj.r.add(2,3,4)
obj.r.add(*[2, 3, 4])
obj.r.remove(1)
obj.r.remove(2,3,4)
obj.r.remove(*[2, 3, 4])
obj.r.clear()
obj.r.set([2, 3, 4])
获取所有相关的主机对象列表  QuerySet对象
obj.r.all()

作业:

   1.主机管理:增删改查

   2.应用管理:增删改查

   3.ajax方式

   4.新url方式

知识点概要:

urls


views

请求的其他信息
            request: from django.core.handlers.wsgi import WSGIRequest
            获取信息
            request.environ
            request.environ["HTTP_USER_AGENT"]

models

一对多操作

多对多操作

templates

自定义函数  

# 模板继承
            {% extends "master.html"%}
            {% block title %}需要替换的内容{% endblock %}
            {% include "tag.html" %}
        # 模板函数
            {{ time|date:"Y-m-d H:i:s" }}
            {{ string|truncatewords:"30" }}
            {{ list|first|upper }}
            {{ name|lower }}
            {{ name|safe }}  # 安全代码,可以解析网页标签
        # 自定义函数
            # simple_tag
                a.app下新建文件夹:templatetags
                b.任意py文件
                c.创建template对象 register
                d.创建函数
                    from django import template
                    register = template.Library()
                    @register.simple_tag
                    def func(arg1, arg2, ...):
                        return "xxoo"
                e.settings中注册app
                f.html文件顶部{% load py文件名 %}
                g.html调用{% 函数名 arg1 arg2 %}
                优点: 任意个参数
                缺点:不能用在if语句
            # filter
                a.app下新建文件夹:templatetags
                b.任意py文件
                c.创建template对象 register
                d.创建函数
                    from django import template
                    register = template.Library()
                    @register.filter
                    def func(arg1, arg2):
                        return "xxoo"
                e.settings中注册app
                f.html文件顶部{% load py文件名 %}
                g.html调用{{ arg1|函数名:arg2 }}
                优点:能用在if语句
                缺点:只能有两个参数,不能加空格

装饰器

cookie

form验证

缓存

中间件

信号

csrf

admin


上节内容回顾

1、请求周期:

url -> 路由 -> 函数或类 -> 返回字符串或模板语言


Form表单提交

提交 -> url -> 函数或类中的方法

HttpResponse(“…”)

render(request, “index.html”)

redirect(“/index”) 当收到redirect自动发起另一个请求

用户 <- 字符串 <-

当收到redirect自动发起另一个请求 -> url


Ajax提交

$.ajax({
            url: "/index",
            data: {"k", "v", "list": [1, 2, 3, 4]}, //$(form对象).serialize()
            type: "POST",
            dataType: "JSON",
            traditional: true,  # 让后台支持列表获取
            success: function(d){
                location.reload() 刷新页面
                location.href ="" 跳转
            }
        })

提交 -> url -> 函数或类中的方法
                    HttpResponse()  返回字符串json.dumps()
                    render()  # 前端不能修改的字符串
                    redirect()  # 不可以
    用户 <- 字符串  <-

2、路由系统URL


a./index/                          -> 函数或类
    b./index/(\d+)                     -> 函数或类
    c./index/(?P<nid>\d+)              -> 函数或类
    d./index/(?P<nid>\d+) name="root"  -> 函数或类
        reverse()          反转url
        {% url "root" 1%}  模板语言
    e./crm/   include("app.urls")      -> 路由分发
    f.默认值
        /index/, views.index, {"name": "root"}
        def func(request, name):
            print(name) # "root"
    g.命名空间
        /a/   include("app.urls", namespace="m1")
        /b/   include("app.urls", namespace="m2")

 

app.urls
        app_name = "app"
        /index/  name="n1"
        reverse("m1:n1")    反转url
        {% url "m1:n1" 1%}  模板语言

3、request


def func(request):
        request.method
        request.GET
        request.POST
        request.FILES
        request.get()
        request.getlist()
        request.path_info  # 当前url
        return HttpResponse render redirect

4、模板引擎


render(request, "index.html")
    # for
    # if
    # 索引(.) keys values items all

5、数据库操作


class User(models.Model):
        username = models.CharField(max_length=32)
        email = models.EmailField()
    有验证功能:
        DjangoAdmin
    无验证功能:
    models.User.objects.create(username="root",email="xxx@qq.com")
    models.User.objects.filter(id=1).update(email="yyy@qq.com")
    # 一对多关系
    class UserType(models.Model):
        name = models.CharField(max_length=32)
    class User(models.Model):
        username = models.CharField(max_length=32)
        email = models.EmailField()
        user_type = ForeignKey("UserType")  # 默认创建 user_type_id 字段
    user_list = models.User.objects.all()  # select * from user;
    for user in user_list:
        user.username  user.email user.user_type_id   # 字段
        user.user_type.name  user.user_type.id   # 对象  通过 "." 访问
    user = models.User.objects.get(id=1)
    user.属性
    models.User.objects.all().values("username", "user_type__name") # 通过 "__" 访问
    # 多对多关系
    class UserType(models.Model):
        name = models.CharField(max_length=32)
    class User(models.Model):
        username = models.CharField(max_length=32)
        email = models.EmailField()
        user_type = models.ForeignKey("UserType")  # 默认创建 user_type_id 字段
        m = models.ManyToMany("UserGroup")  # 放在两张关系表任意一张都行
        # 创建第三张表
    class UserGroup(models.Model):
        name = models.CharField(max_length=32)
    user = models.User.objects.get(id=1)
    user.m.add(2)
    user.m.add(2, 3, 4)
    user.m.add(*[2, 3, 4])
    user.m.clear()
    user.m.remove()
    user.m.set([1, 2, 3])
    user.m.all()  # 多个组 UserGroup对象
    user.m.filter(name="CTO")
作业:
    主机管理
        1.单表操作
        2.1对多
        3.多对多
        要求:
           1. 删除对话框
            2. 修改,添加新url
            3. 基于cookie进行用户验证
            4. 定制显示个数
            5. 分页
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
126 80
|
24天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
53 14
|
2月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
119 2
|
2月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
65 10
|
2月前
|
人工智能 数据挖掘 开发者
探索Python编程之美:从基础到进阶
本文是一篇深入浅出的Python编程指南,旨在帮助初学者理解Python编程的核心概念,并引导他们逐步掌握更高级的技术。文章不仅涵盖了Python的基础语法,还深入探讨了面向对象编程、函数式编程等高级主题。通过丰富的代码示例和实践项目,读者将能够巩固所学知识,提升编程技能。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起踏上Python编程的美妙旅程吧!
|
2月前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
95 6
|
1月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
58 2
|
2月前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
183 3

热门文章

最新文章