Python全栈 Web(Django框架、模板继承、模型)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Flask、Python、Django、框架、服务器、客户端、浏览器、交互、WEB、Python前端、CSS、JAVA、HTML、H5、PHP、JavaScript、JQuery、分布式开发、项目、flask项目、项目实战、django框架、Python项目、Python的Flask框架、Python.
模板的继承:
    语法:
        在父模板中
          必须要标识出那些内容在子模板中允许为修改
          {% block 名称 %}
          {% endblock %}
        在子模板中
          指定继承自那个父模板
          {% extends '父模板名称' %}
          增加block标签 改写属于自的内容
          {% block 名称 %}
          {% endblock %}


        block的作用:
            在父模板中正常显示
            在子模板中 如果不修改的话 则按父模板的内容显示
            要是修改的话则按照子模板的内容显示


<!doctype html>
<html>
 <head>
  <meta charset="UTF-8">

  <title>{% block title %}天天果园-会员登录{% endblock %}</title>

	<link rel="stylesheet" href="/static/css/login.css">
    {% block style %}
    {% endblock %}
 </head>
 <body>
  <div id="container">
		<!-- 上 :会员登录 -->
		<h2>{% block header %}会员登录{% endblock %}</h2>
		<!-- 下左:登录图像 -->
		<p>
			<img src="/static/images/huiyuan.jpg">
			{% block anchor %}
			<a href="{% url 'register' %}">会员注册></a>
            {% endblock %}
		</p>
		<!-- 下右:登录表单 -->
      {% block from %}
		<div id="login">
			<form action="login" method="post">
				<!-- 第一行:手机号 -->
				<div class="form-line">
					<p>手机号</p>
					<div>
						<input type="text" name="uphone" class="form-control">
					</div>
				</div>
				<!-- 第二行:密码 -->
				<div class="form-line">
					<p>密码</p>
					<div>
						<input type="password" name="upwd" class="form-control" placeholder="请输入密码">
					</div>
				</div>
				<!-- 第三行:记住密码,忘记密码-->
				<div class="form-line">
					<p></p>
					<div>
						<!-- 右浮动 -->
						<p>
							<a href="#">忘记密码</a>
							<a href="#">快捷登录</a>
						</p>
						<!-- 不浮动 -->
						<input type="checkbox" name="isSaved" class="isSaved" checked>记住密码
					</div>
				</div>
				<!-- 第四行:登录按钮-->
				<div class="form-line">
					<p></p>
					<div>
						<!-- 右:超链接  -->
						<a href="#" class="goReg">注册会员</a>
						<!-- 左:登录按钮 -->
						<input type="submit" value="登录" class="btnLogin">
					</div>
				</div>
			</form>
		</div>
      {% endblock %}
	</div>
 </body>
</html>



利用注册继承登录的模板 这样就可以直接使用登录界面的样式
把想修改的的不笨用继承的方式进行修改就可以


{% extends "login.html" %}

{% block style %}
    <style>
        #login{
            margin-top: 20px;
        }
    </style>
{% endblock %}

{% block title %}
    天天果园.会员注册
{% endblock %}

{% block header %}
    会员注册
{% endblock %}

{% block anchor %}
    <a href="{% url 'login' %}">会员登录</a>
{% endblock %}

{% block from %}
		<div id="login">
			<form action="login" method="post">
				<!-- 第一行:手机号 -->
				<div class="form-line">
					<p>手机号</p>
					<div>
						<input type="text" name="uphone" class="form-control">
					</div>
				</div>
				<!-- 第二行:密码 -->
				<div class="form-line">
					<p>密码</p>
					<div>
						<input type="password" name="upwd" class="form-control" placeholder="请输入密码">
					</div>
				</div>
				<!-- 第三行:确认密码 -->
				<div class="form-line">
					<p>确认密码</p>
					<div>
						<input type="password" name="cpwd" class="form-control" placeholder="确认密码">
					</div>
				</div>
				<!-- 第四行:用户名 -->
				<div class="form-line">
					<p>用户名</p>
					<div>
						<input type="password" name="uname" class="form-control" placeholder="用户名">
					</div>
				</div>
				<!-- 第五行:邮箱 -->
				<div class="form-line">
					<p>用户名</p>
					<div>
						<input type="password" name="email" class="form-control" placeholder="邮箱">
					</div>
				</div>
				<!-- 第六行:登录按钮-->
				<div class="form-line">
					<p></p>
					<div>
						<!-- 右:超链接  -->
						<a href="#" class="goReg">会员登录</a>
						<!-- 左:注册按钮 -->
						<input type="submit" value="注册" class="btnLogin">
					</div>
				</div>
			</form>
		</div>
{% endblock %}




    re_path的name参数:
        re_path(regex, views, kwargs=None, name=None)
        name:为了给当前URL地址起别名的  主要用于URL的反向解析时使用
        反向解析:
            通过别名找到对应的地址
            re_path(regex, views, kwargs=None, name="别名")
        在模板中反向解析:
            1.基本解析
                {% url "别名" %}
            2.带参数解析
                {% url "别名" "参数1" "参数2"... %}


urlpatterns = [ re_path(r"^login/$", login_views, name="login"), ]


    <a href="{% url 'login' %}">会员登录</a>


        在视图中反向解析:
            1.基本解析
                url = reverse("别名")
                url就是通过别名解析出来的地址
            2.带参数解析:
                url = reverse("别名", args=(参数1, 参数2...))
                url就是通过别名解析出来的地址



def reverse_views(request):
    # url = reverse("login")
    url = reverse("arguments", args=("2018", "07"))
    return HttpResponse("解析的地址为:" + url)


模型 Models:
    什么是模型?
       根据数据库表创建出来的class
    ORM三大特征:
        表到类的映射
        数据类型的映射
        关系的映射
    创建数据库:
        create database webdb default charset utf8 collate utf8_general_ci;
    数据库的配置:
        setting.py中配置数据库信息
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            }
        }
        链接到mysql
            ENGINE:mysql:django.db.backends.mysql
            NAME:连接到的数据库名
            USER:登录到数据库的用户名
            PASSWORD:登录到数据库的密码
            HOST:连接到的主机地址
            PORT:指定端口  MySQL默认3306

# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "webdb",
        "USER": "root",
        "PASSWORD": "ParisPython",
        "HOST": "localhost",
        "PORT": 3306
    }
}



    数据库的同步操作:
        ./manage.py makemigrations
          作用:
            将每个应用下的models.py文件生成一个数据库的中间文件
            并将中间文件保存在 migrations的目录中
        ./manage.py migrate
          作用:
            将每个应用中的migrations目录中的中间文件同步到数据库
    编写Models:
        示例:

from django.db import models

# Create your models here.


# 在index应用中的models.py中
# 创建一个实体类
# Publisher
# 用于表示出版社
class Publisher(models.Model):
    # 属性如下
    # name:出版社的名称(varchar)
    name = models.CharField(max_length=30)
    # address:出版社所在地址(varchar)
    address = models.CharField(max_length=200)
    # city:出版社所在城市(varchar)
    city = models.CharField(max_length=50)
    # country:出版社所在国家(varchar)
    country = models.CharField(max_length=50)
    # website:出版社网站(varchar
    website = models.URLField


class Author(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    email = models.EmailField(null=True)
    # True表示用户的激活状态
    # 由于是新增列 所以必须要给默认值后允许为空
    # 由于BlooeanField默认值是不允许为空的  所以此处选择增加默认值
    isActive = models.BooleanField(default=True)


class Book(models.Model):
    title = models.CharField(max_length=50)
    publicate_data = models.DateField()


    Models的语法规范:
        class ClassName(models.Model):
            属性 = models.字段类型(字段选项)
            字段类型:映射到数据库表中的数据类型
                CharField() -varchar
            字段选项:
                max_length=30

        字段类型(Filed Type):
            BooleanField()
                编程语言中用True和False表示该列的值
                数据库中使用1和0来表示具体的值
                数据类型为:tinyint
            CharField()
                字符串
                数据类型为是varchar
            DataField()
                编程语言中使用字符串或data类型的数据表示值
                数据库中使用时间和字符串
                数据类型为:data  日期时间
            DatetimeField()
                数据类型为:datetime  精确到十分秒
            DecimalField()
                数据类型为decimal
                money = models.DecimalField(max_digits=7, decimal_places=2)
            FloatField()
                数据类型为float
            IntegerFiled()
                数据类型为:int
            EmailField()
                数据类型:varchar
            URLField()
                数据类型为:varchar
            ImageFiled()
                存储图片的路径
                数据类型为varchar
                image = models.ImageField(upload_to="images/users")
        字段选项(Field options):
            default
                为当前字段指定默认值
            null
                指定当前字段是否允许为空 默认为False
            primary_key
                指定是否为主键
            db.column
                指定当前字段映射到列表中类的名字
                如果不指定采用属性名作为字段名
    相关指令:
        通过数据库自动导出models
            ./manage.py inspectdb > 文件名.py
        数据的版本切换
            ./manage.py migrate
            执行所有应用中最新版本的数据库中间文件
            ./manage.py migrate 应用名称 版本号
            执行指定应用中的指定版本的中间文件
            ./manage.py migrate index 0002


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
28天前
|
安全 测试技术 网络安全
如何在Python Web开发中进行安全测试?
如何在Python Web开发中进行安全测试?
|
28天前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
33 4
|
28天前
|
存储 监控 安全
如何在Python Web开发中确保应用的安全性?
如何在Python Web开发中确保应用的安全性?
|
26天前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
26天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
35 2
|
26天前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
34 1
|
27天前
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
|
28天前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
28 4
|
28天前
|
存储 开发框架 关系型数据库
|
1月前
|
关系型数据库 数据库 数据安全/隐私保护
Python Web开发
Python Web开发
83 6
下一篇
DataWorks