Web开发day4:Django介绍

目录

1. 组件

2. 版本、创建

3. 创建app

4. 快速上手

4.1 注册app(setting.py)

4.2  编写URL和视图函数的对应关系(urls.py)

4.3 编写视图函数(views.py)

4.4 启动django项目

5. templates模板

5.1 创建 html 文件

5.2 views.py 文件下创建函数

5.3 urls.py 文件下建立URL和视图对应关系

5.4 启动django

6. 模板语言

7. 请求和响应

案例:请求与响应案例 

8.  连接MySQL(django的ORM框架)

8.1 安装第三方模块(代码 → ORM → mysqlclient → 数据库)

8.2 ORM

8.3 创建数据库

8.4 django连接数据库


进度来源:最新Python的web开发全家桶(django+前端+数据库)

网址:最新Python的web开发全家桶(django+前端+数据库)_哔哩哔哩_bilibili

1. 组件

  • 基本配置文件/路由系统
  • 模型层(M) / 模板层(T) / 视图层(V),分别对应联通数据库、渲染页面、请求进来交给谁
  • Cookies和Session,Web中记住HTTP状态的实现技术
  • 分页及发邮件
  • Admin管理后台

2. 版本、创建

Django官网:The web framework for perfectionists with deadlines | Django

Django中文文档参考网站:一译

使用版本:3.2.16

使用pycharm创建django项目后,先删除templates文件夹,再删除settings.py文件中的一条语句:

# 文件目录
·demo_django
    ·manage.py              【项目的管理,启动项目,创建app,数据管理,代码不用改】
    ·demo_django
        ·__init__.py
        ·settings.py        【项目配置】【!!常常修改!!】
        ·urls.py            【URL和函数的对应关系】【!!常常修改!!】
        ·asgi.py            【接收网络请求,代码不用改】
        ·wsgi.py            【接收网络请求,代码不用改】

3. 创建app

pycharm终端界面输入:

# 命令格式为:python manage.py startapp app名称
>>python manage.py startapp app01
# 文件目录
·app01
    ·__init__.py
    ·admin.py           【固定,不用动】django默认提供了admin后台管理
    ·apps.py            【固定,不用动】app启动类
    ·migrations         【固定,不用动】数据库变更记录
        ·__init__.py
    ·model.py           【重要】对数据库操作
    ·tests.py           【固定,不用动】单元测试
    ·views.py           【重要】与URL对应的函数定义在此

4. 快速上手

4.1 注册app(setting.py)

在 settings.py 文件的 INSTALLED_APPS 中添加 'app01.apps.App01Config' 

4.2  编写URL和视图函数的对应关系(urls.py)

如下设置表示,只要用户访问 'www.xxx/index/',就会去 views.py 文件中找 index 函数执行

4.3 编写视图函数(views.py)

4.4 启动django项目

  • 命令行启动
>>python manage.py runserver
  • pycharm启动

页面显示: 

5. templates模板

5.1 创建 html 文件

编写页面代码,文件夹为 app01/templates/user_list.html

5.2 views.py 文件下创建函数

返回 render(request, user_list.html),按照 app 的注册顺序,在不同 app/templates 文件夹下找 user_list.html

5.3 urls.py 文件下建立URL和视图对应关系

5.4 启动django

输入对应网址,页面展示

6. 模板语言

# views中的tpl函数
def tpl(request):
    name = '张三'
    roles = ['管理员', 'CEO', '保安']
    user_info = {'name': '李四', 'salary': 1000, 'role': 'CTO'}

    return render(request, 'tpl.html', {'n1': name, 'n2': roles, 'n3': user_info})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>单个变量:{{ n1 }}</div>
    <hr/>
    <div>整个列表:{{ n2 }}</div>
    <div>列表单个元素,不再用切片:
        {{ n2.0 }}
        {{ n2.1 }}
        {{ n2.2 }}
    </div>
    <div>列表遍历:
        {% for each in n2 %}
            <span>{{ each }}</span>
        {% endfor %}
    </div>
    <hr/>
    <div>整个字典:{{ n3 }}</div>
    <div>字典按键访问:
        {{ n3.name }}
        {{ n3.salary }}
        {{ n3.role }}
    </div>
    <div>遍历访问字典的键:
        {% for key in n3.keys %}
            <span>{{ key }}</span>
        {% endfor %}
    </div>
    <div>遍历访问字典的值:
        {% for value in n3.values %}
            <span>{{ value }}</span>
        {% endfor %}
    </div>
    <div>遍历访问字典的每个item:
        {% for k, v in n3.items %}
            <span>{{ k }}:{{ v }}</span>
        {% endfor %}
    </div>

</body>
</html>

效果展示:

7. 请求和响应

def something(request):
    # request是一个对象,封装了用户发送过来的所有请求相关数据

    # 1.获取请求方式 GET/POST
    print(request.method)

    # 2.在URL上传递值 /something/?n1=123&n2=999
    print(request.GET)

    # 3.在请求体中提交数据
    print(request.POST)

    # 4.【响应1】HttpResponse("返回内容"),内容字符串内容返回给请求者
    return HttpResponse("欢迎光临")

    # 5.【响应2】render(request, 'something.html', {'title': '来了'}),读取html内容,渲染替换,以字符串形式返回给用户浏览器
    return render(request, 'something.html', {'title': '来了'})

    # 6.【响应3】重定向到其他网站,告诉浏览器自己向baidu服务器发送请求
    return redirect("https://www.baidu.com")

案例:请求与响应案例 

def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    else:
        username = request.POST.get('user')
        password = request.POST.get('pwd')

        if username == 'root' and password == '123':
            return HttpResponse("登录成功")
        else:
            return render(request, 'login.html', {'error_msg': "用户名或密码错误"})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post" action="/login/">
        <!--必须写在form里边,不然会报错403-->
        {% csrf_token %}

        <input type="text" name="user" placeholder="用户名" />
        <input type="password" name="pwd" placeholder="密码" />
        <input type="submit" value="提交" />
        <span style="color: red">{{ error_msg }}</span>
    </form>
</body>
</html>

效果图:

8.  连接MySQL(django的ORM框架)

8.1 安装第三方模块(代码 → ORM → mysqlclient → 数据库)

pip install mysqlclient

8.2 ORM

  • 创建、删除、修改数据库中的表(不用写SQL语句)
  • 操作表中的数据(不用写SQL语句)
  • 但ORM不能创建数据库,数据库必须自己创建

8.3 创建数据库

mysql>>create database demo DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

8.4 django连接数据库

  • 设置数据库相关信息(在setting.py文件里进行修改)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',    # 引擎,可选不同数据库
        'NAME': 'demo',                          # 数据库名字
        'USER': 'root',                          # 用户名
        'PASSWORD': '123456',                    # 密码
        'HOST': '127.0.0.1',                     # 主机,也可写localhost,指安装了MySQL的主机
        'PORT': 3306,                            # 端口号
    }
}
  • 创建表、删除表、修改表(在models.py文件里进行修改),删表、新增列、删除列 → 在models.py中注释后再执行两条命令即可,可以设置新增列的默认值,或手动输入值,或允许为空
# model.py文件
from django.db import models


class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField()
    # data1 = models.IntegerField(default=2)
    # data2 = models.IntegerField(null=True, blank=True)


# 表名 = app名称 + _ + class名的小写
"""
create table app01_userinfo(
    id bigint auto_increment primary key,
    name varchar(32),
    password varchar(64),
    age int,
"""
1.确保当前app已注册,确保已安装mysqlclient

2.终端切换到manage.py文件所在目录下,即项目根目录,执行
>>python manage.py makemigrations
>>python manage.py migrate

  • 增删改查,在views.py的函数中可以对数据库进行各项操作
from models import UserInfo, Department
def orm(request):
    # 新建数据
    Department.objects.create(title="销售部")
    UserInfo.objects.create(name="刘备", password=123)
    UserInfo.objects.create(name="关羽", password=123, age=21)

    # 删除数据
    UserInfo.objects.filter(id=3).delete()
    Department.objects.all().delete()

    # 选择数据
    # 获取的类型是QuerySet,相当于一个列表,每个元素是一行
    data_list = UserInfo.objects.all()
    for obj in data_list:
        print(obj.id, obj.name, obj.password, obj.age)
    # 获取一行的数据,类型也是QuerySet,加first()就是第一个,类型是对象
    data1 = UserInfo.objects.filter(id=2)
    data2 = UserInfo.objects.filter(id=2).first()

    # 更新数据
    UserInfo.objects.all().update(password=999)
    UserInfo.objects.filter(id=2).update(age=999)

    return HttpResponse("你好")
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我选择四娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值