【python web】【django】django 快速上手

0 django 学习参考资料

1 快速搭建django 项目:https://blog.csdn.net/Ans_min/article/details/123146335
2 django mvc 介绍详见 https://www.jb51.net/article/107884.htm
3 django 各个 目录 文件结构 什么意思详见: https://www.jb51.net/article/278803.htm#_label2

https://www.knowledgedict.com/tutorial/django-template.html#%E6%A8%A1%E6%9D%BF%E6%96%87%E4%BB%B6%E5%AD%98%E6%94%BE%E4%BD%8D%E7%BD%AE

1 pip install 安装

1.1 安装

pip install django

1.2 django-admin.exe 简介

pip 安装完成后,会生成 该exe文件, 用于操作django项目,其目录结构如下。
在这里插入图片描述

2 创建django项目

2.1 命令行 和 pycharm 两种方式:

1 命令行:通过 django-admin.exe 来创建项目: django-admin.exe startproject django项目名
2 pycharm : 略,详见 2.2 快速搭建django 项目:https://blog.csdn.net/Ans_min/article/details/123146335

2.2 项目目录结构介绍

djangoProject
│─ manage.py		【项目管理的脚本,不要修改,eg:启动、创建app、数据库管理等】
└─djangoProject		【与项目同名的文件夹】
     │─ asgi.py			【和wsgi.py一起,接收网络请求的】【不用修改】【Django接收异步的】
     │─ settings.py	【项目的配置文件,eg:数据库连接信息、注册app等】【常操作】
     │─ urls.py			【全部的URL和函数的对应关系】【常操作】
     │─ wsgi.py			【和asgi.py一起,接收网络请求的】【不用修改】【Django接收同步的】
     │─ __init__.py

3 创建app(功能模块的意思)

cmd 切换到 当前项目路径下,执行命令 python manage.py startapp app名
在这里插入图片描述

3.1 app 目录结构介绍


djangoProject
│  manage.py
├─djangoProject
│     asgi.py
│     settings.py
│     urls.py
│     wsgi.py
│     __init__.py
└─app_test					【app名命名的文件夹】
    │  admin.py				【固定的不用动】django默认提供的后台管理,但实际开发不常用
    │  apps.py				【固定的不用动】app启动相关
    │  models.py			【☆很重要,对数据库进行操作】这里不用SQL写了,Django封装了ORM供调用
    │  tests.py				【固定的不用动】用来单元功能测试的,个人小项目可以不用管
    │  views.py				【☆很重要,撰写视图函数(得我们自己写的)】
    │  __init__.py
    └─migrations			【固定的不用动】数据库变更记录,会自动生成文件,我们不用动
            __init__.py

3.2 注册app

想要创建的 app生效,需要在settings.py 文件中 引入。
app创建完成后,apps.py文件自动生成的内容如图,需要将该类引入到 settings.py INSTALLED_APPS=[] 中,app才生效
在这里插入图片描述

# settings.py 文件
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app_test.apps.AppTestConfig', # 这里引入的app_test模块
]

4 django 快速上手

django项目运行起来还需要 以下几方面的操作

4.1 urls.py 和 view.py视图方法的映射

web 界面调用 uri 的时候 映射到view.py 文件中相对应的方法
urls.py 配置

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app_test_index/', views.test_index), # path()方法中的第一个参数是web页面访问url中的uri部分,(https:ip/uri), 第二个参数 是view.py 文件中的 def test_index 方法。**该方法需要自己在 view.py 中定义**
]

path(‘app_test_index/’, views.test_index), # path()方法中的第一个参数是web页面访问url中的uri部分,(https:ip/uri), 第二个参数 是view.py 文件中的 def test_index 方法。该方法需要自己在 view.py 中定义

view.py 配置

from django.shortcuts import render


def test_index(request): # request 参数必须写
    return render(request, 'app_test.html')
    render() 中,第一个参数,就是 传入的 request,  第二个参数是返回的 html 文件, 这里的 html 文件也是自己创建的

render() 中,第一个参数,就是 传入的 request, 第二个参数是返回的 html 文件, 这里的 html 文件也是自己创建的
这个html 在哪里创建呢? 引入 模板文件和静态文件的概念

4.2 模板文件和静态文件

比如: 我们想在 项目根目录下 存放我们的 模板文件templates 和 静态文件 static_files
在这里插入图片描述
模板文件 就是 项目中的 templates目录,用于存放 html 文件
静态文件 就是 项目中的 static_files 目录,用于存放 js css 图片等资源

4.2.1 模板文件路径设置

settings.py 文件中 的 TEMPLATES 代码块 的 DIRS 便是 templates 的路径,
默认情况下 是在项目根目录的 templates目录下 ,
BASE_DIR = Path(file).resolve().parent.parent 表示的就是 项目根目录

BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / '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',
            ],
        },
    },
]

4.2.2 静态文件路径设置

settings.py 文件中 STATIC_URL = ‘static/’ 后边 增加 如下代码

STATICFILES_DIRS = [
    os.path.join(BASE_DIR / 'static_files')
]

在这里插入图片描述

其中 STATIC_URL = ‘static/’ 中的 static/ 是 html 文件中路径的引用指针 ,其值等于下方STATICFILES_DIRS的静态文件路径,不代表静态文件的存放路径,可以任意命名, 只是为了 html 调用方便,举个例子如下:

tasks.html 中引用静态文件 static_files/img/h1_h2.png
在这里插入图片描述
我们settings.py 文件中 STATIC_URL 配置为 ‘static1/’
STATICFILES_DIRS 中配置上 static_files 目录
在这里插入图片描述
启动django 项目,web页面访问tasks.html,查看源html 可以看到渲染出来的引用路径是 /static1/img/h1_h2.png
这里的static1 就是 settings.py 中配置的 STATIFC_URL 的值,由此可以看出,web页面渲染出来的 是 这个引用指针,而不是实际的路径,其实际的路径指向 STATICFILES_DIRS 中的路径,
在这里插入图片描述

以下 两个图引用自其他地方 详情见: https://www.jb51.net/article/107884.htm
在这里插入图片描述
在这里插入图片描述

疑问??????

app目录下存放我们的 模板文件templates 和 静态文件 static_files 如何设置呢: 设置方法可能是 下边的,
‘DIRS’: [],
STATICFILES_DIRS = []

4.2.3 html 文件引用静态文件语法

在这里插入图片描述

4.2.4 启动django项目

pycharm 项目右上角 绿色 三角启动即可,启动之后变为红色方块,下方可以看到 web项目的 访问路径
在这里插入图片描述

命令行方式启动:
python manage.py runserver ip:端口号
eg: python manage.py runserver 127.0.0.1:8000

4.3 返回数据给前端页面

https://www.jb51.net/article/107884.htm

一般都是 用户在web页面做某些操作如 查询,我们需要将数据库中的数据返回到页面上,
以我们访问 http://127.0.0.1:8000/temp_learn/ 为例子,返回给用户 web页面,并把数据渲染到页面上
用到的文件有:

  • urls.py: urlpatterns 中增加 path(‘temp_learn/’, views.temp_learn)
  • views.py: 增加def temp_learn()方法, 当用户访问url 的时候,这个方法 返回 html 页面 和 需要显示在页面上的数据
  • temp_learn.html: html 页面 views.py 的 def temp_learn()方法中 把temp_learn.html 页面返回给用户。

这里重点讲 view.py怎么把数据返回给 temp_learn.html文件

几个文件内容增加的代码如下:

# urls.py 文件:urlpatterns 中增加  path('temp_learn/', views.temp_learn)
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp_learn/', views.temp_learn)  
]

4.3.1 views.py render()返回html 和 数据

# views.py 文件 增加 def temp_learn()方法
def temp_learn(request):
    n1 = '数学'
    cl = ['lili', 'liming']
    c_info = {
        'name': 'xiaoli',
        'age': '15',
        'math': '90'
    }
    return render(request, "temp_learn.html", {'course': n1, 'classmate': cl, 'info': c_info})

render() 中三个参数:render(request, “temp_learn.html”, {‘course’: n1, ‘classmate’: cl, ‘info’: c_info})
参数1:request 是固定的,就是用户的请求,
参数2:“temp_learn.html”: 用户发送url 请求,返回给的用户承载数据的 html 页面
参数3:字典类型,就是需要渲染到页面上的数据 如:{‘course’: n1, ‘classmate’: cl, ‘info’: c_info}

4.3.2 html页面渲染render()返回的数据

字符串 列表 字典 如何调用,if 语句 for 语句如何书写。如下:
{{ }} 双括号 中填写变量,变量就是 render()参数三 返回的字典,用到字典中的哪个值,通过字典的key 调用即可
{‘course’: n1, ‘classmate’: cl, ‘info’: c_info} 根据4.3.1 中可知道, course 的值 是字符串类型, classmate 是 列表类型的, info 是 字典类型的

  • 字符串类型调用: {{ course }}

  • 列表调用:{{ classmate }}

  • 通过索引调用列表中的某个值: {{ classmate.0 }} .0表示 列表中的第一个值

  • 字典调用:{{ info }}

  • 通过.key调用字典中的某个值:{{ info.age }}

  • if 语句
    {% if 条件1 %}
    html 标签
    {% elif 条件2 %}
    html 标签
    {% else %}
    html 标签
    {% endif %}

  • for 语句
    {% for x in xxx %}
    html 标签
    {% endfor %}

// temp_learn.html 内容如下
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板语法学习</title>

</head>
<body>
<div>
    <div>变量语法:字符串类型 课程 = {{ course }}</div>
    <div>列表类型:列表所有的值 :{{ classmate }}</div>
    <div>列表类型:列表索引调用: {{ classmate.0 }} , {{ classmate.1 }}</div>
    <div>字典类型: 字典的所有值: {{ info }}</div>
    <div>字典类型: 字典中的某个值:年龄: {{ info.age }}</div>
    <div>对列表 for 循环:
        {% for class in  classmate%}
        <ul>同学名字: {{ class }}</ul>
        {% endfor %}
    </div>
    <div>对字典 for 循环:
        {% for key in  info.keys %}
        <ul>字典中所有key值,info.keys循环: {{ class }}</ul>
        {% endfor %}
        {% for value in  info.values %}
        <ul>字典中所有value值,info.values 循环: {{ class }}</ul>
        {% endfor %}
        {% for k,v in  info.items %}
        <ul>key, value同时循环 info.items 循环 : {{ class }}</ul>
        {% endfor %}
    </div>
    <div>if 语句:
    {% if info.math > 90 %}
        <span>数学成绩大于90</span>
    {% elif info.math == 90 %}
        <span>数学成绩等于90</span>
    {% else %}
        <span>数学成绩小于90</span>
    {% endif %}
    </div>
</div>
</body>
</html>

web 页面渲染结果如下:

在这里插入图片描述

4.3.4 request & response

  • request:
    request.method:获取用户请求提交方式(GET/POST)
    request.GET:获取通过URL传递的参数
    request.POST:通过请求体中获得数据
    在这里插入图片描述

  • response:
    HttpResponse():返回内容字符串给请求者;

render():读取HTML,并渲染,最终以字符串的格式返回给用户浏览器;

redirect():让浏览器重定向到其他页面,返回的是网址。
浏览器提交请求给Django,Django收到请求并直接返回给浏览器重定向的网址,浏览器重新去新的网址那里提交请求,然后新的网址给浏览器返回响应数据。

4.3.5 数据库 ORM 操作

ORM 简介:

一般我们操作数据库 是通过写 比如pymysql 代码–》sql 语句来实现的,select * from db
django 的 ORM 是 封装了sql 语句,不需要我们自己写sql 语句了,通过操作 models.py 文件,写models相关的语法语句,(django 把models相关的语句 转换成 sql 语句再去操作数据库)从而实现操作数据库。
原理示意图 如下: 图片来自于 https://blog.csdn.net/Ans_min/article/details/123146335
在这里插入图片描述

ORM可以帮助我们做两件事:
1 增删改查数据库中的表(不用写SQL语句)【但数据库你得自己建】
2 操作表中数据,即增删改查表中记录(不用写SQL语句)

settings.py 数据库配置,

在这里插入图片描述

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
tasks/models.py 写作

给 tasks 这个 app创建表 通过models.py 文件中创建一个类来实现,类中写数据表中包含的字段。django 会根据这个类转换成数据表,最后创建的数据表名字是 app名字_类名

from django.db import models

# Create your models here.


class UserInfo(models.Model): # 这里继承是固定写法,类名自定义,
    # 创建两个表字段 username  password, 都是 char 类型,长度分别是 32  64
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)

执行命令,生成数据库表

python manage.py makemigrations
python manage.py migrate
执行上边两个命令,django 就会解析 models.py 执行数据库操作

在这里插入图片描述

pycharm 查看 数据库

在这里插入图片描述
File 这里选择django 项目的 db.sqlite3数据库,测试连接成功。
在这里插入图片描述
Schemas 这里选择 All schemas
非常重要,否则看不到数据表
在这里插入图片描述
查看表: tasks_userinfo(表名是app名称_类名)
在这里插入图片描述

生成表的原理是django去所有app的models.py中找需要创建的表,在settings.py中可以看到,有很多django默认自带的app(如下图),所以除了tasks_userinfo表,其他表都是django自带生成的表,我们暂先不用管。

如果还想新建表,就再在models.py里写类,然后执行那两个指令即可。

4.4 练习

文本框中输入用户名和密码,提交后返回用户信息页面,把用户名密码展示到页面上。
如上,我们用到两个页面,
add_user.html : 用户名 密码输入页面,
user_info.html:login提交之后 返回的页面

# add_user.html 代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>user add page</title>
</head>
<body>
<form action="/user_info/" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" name="提交">
</form>
</body>
</html>
# user_info.html 代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>users info page</title>
</head>
<body>
<div>
    <table border="1">
        <thead>
            <th>用户名</th>
            <th>密码</th>
        </thead>
        <tbody>
            <tr>
                <td>{{ username }}</td>
                <td>{{ password }}</td>
            </tr>
        </tbody>
    </table>
</div>
</body>
</html>

urls.py 文件: 增加 add_user user_info 路由;

# urls.py 文件
urlpatterns = [
    path('admin/', admin.site.urls),
    path('add_user/', views.add_user),
    path('user_info/', views.user_info),
]

views.py 文件:增加两个方法

# views.py 文件
def add_user(request):
    return render(request, "add_user.html")


def user_info(request):
    user = request.POST.get("username")
    pwd = request.POST.get("password")
    return render(request, "user_info.html", {"username":user, "password": pwd})

输入用户名 密码 提交
在这里插入图片描述

提交后返回这个页面:
在这里插入图片描述
因为django有一个跨站请求保护机制,我们在settings文件中将它关闭。如图,注释掉即可。
在这里插入图片描述
提交之后返回 user_info.html 页面并且把刚刚输入的信息展示出来
在这里插入图片描述

项目实战

功能模块

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值