Django-Part1——基础操作

[TOC]

后端

后端很重要,每个领域的知识都应该学,要做一个全能型人才

软件开发架构

  • cs架构(Client/Server) 建立在局域网的基础上
  • bs架构(Browser/Server) 建立在广域网的基础上

bs本质也是cs

HTTP协议

网络协议

  1. HTTP协议 数据传输是明文
  2. HTTPS协议 数据传输是密文
  3. websocket协议 数据传输是密文

四大特性

  1. 基于请求响应
  2. 基于TCP、IP作用于应用层之上的协议
  3. 无状态
  4. 短/无链接

数据格式

  1. 请求首行
  2. 请求头
  3. 请求体

响应状态码

  • 1xx:指示信息–表示请求已接收,继续处理。
  • 2xx:成功–表示请求已被成功接收、理解、接受。
  • 3xx:重定向–要完成请求必须进行更进一步的操作。
  • 4xx:客户端错误–请求有语法错误或请求无法实现。
  • 5xx:服务器端错误–服务器未能实现合法的请求。

响应状态码大全

wsgiref模块

文件

  1. urls.py 路由与视图函数对应关系
  2. views.py 视图函数(后端业务逻辑)
  3. templates文件夹 专门用来存储html文件

按照功能的不同拆分之后,后续添加功能只需要在urls.py注册对应关系然后在views.py书写业务逻辑即可

流程

  1. 请求来的时候解析http格式的数据,封装成大字典
  2. 响应走的时候给数据打包成符合http格式,再返回给浏览器

动静态网页

  • 静态网页

    • 页面上的数据是直接写死的,万年不变
  • 动态网页

    • 页面框架不变,而数据是实时获取的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 动态网页制作
import datetime
def get_time(env):
# 动态获取当前时间,即每次获取的都不固定
current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
# 将后端获取到的数据传递给html文件
with open(r'templates/03 mytime.html','r',encoding='utf-8') as f:
# data就是一堆字符串
data = f.read()
# 在后端将html页面处理好之后再返回给前端
data = data.replace('dwadasdsadsadasdas',current_time)
# 返回带有动态数据的html页面
return data

# 将一个字典传递给html文件,更加方便快捷的操作字典数据
from jinja2 import Template
def get_dict(env):
user_dic = {'username':'jason','age':18,'hobby':'read'}
with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f:
data = f.read()
tmp = Template(data)
res = tmp.render(user=user_dic)
# 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
return res

模版语法之Jinja2模块

模版语法仅在后端服务器上起作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 模版语法(非常贴近python语法)
{{ user }}
{{ user.get('username')}}
{{ user.age }}
{{ user['hobby'] }}

# 循环
{% for user_dict in user_list %}
<tr>
<td>{{ user_dict.id}}</td>
<td>{{ user_dict.username}}</td>
<td>{{ user_dict.password}}</td>
<td>{{ user_dict.hobby}}</td>
</tr>
{% endfor%}

Python三大主流web框架

  1. django

    • 特点:大而全,自带的功能特别多
    • 不足之处:有时候过于笨重
    • 组成:
      • socket部分用的是别人的:wsgiref模块
      • 路由匹配用的是自己的
      • 模版语法用的是自己的(没有jinja2好用 但是也很方便)
  2. flask

    • 特点:小而精,自带的功能特别少。但第三方的模块特别多,如果将flask第三方的模块加起来完全可以盖过django,并且也越来越像django
    • 不足之处:比较依赖于第三方的开发者,可能不兼容
    • 组成:
      • socket部分用的是别人的:werkzeug(内部还是wsgiref模块)
      • 路由匹配用的是自己的
      • 模版语法用的是别人的:jinja2
  3. tornado

    • 特点:异步非阻塞,支持高并发,甚至可以开发游戏服务器
    • 组成:
      • socket部分用的是自己的
      • 路由匹配用的是自己的
      • 模版语法用的是自己的

开始Django

如何让你的计算机能够正常的启动django项目

  1. 计算机的名称不能是中文
  2. 一个pycharm窗口只开一个django项目
  3. 项目里面所有的文件也尽量不要出现中文
  4. python解释器尽量使用3.4~3.6之间的版本(如果依然报错,点击最后一个报错信息,在源码中把逗号删掉)

django安装

  • 如果已经安装了其他版本,可以pip install django==xx.xx.xx自动卸载安装新的版本
  • 在mac终端可以输入django-admin验证安装成功

基本操作

命令行操作

  1. 切换到指定目录,创建django项目
    django-admin startproject mysite

  2. 启动django项目

    cd /mysite

    python3 manage.py runserver

  3. 创建应用

    python manage.py startapp app01

使用命令行创建项目时一定要记得配置templates路径,建议使用pycharm创建

pycharm操作

  1. new project -> django

  2. 启动django项目

    命令行 或者 绿色箭头运行

  3. 创建应用

    命令行 或者 tools -> run manage.py task -> start app02(有提示,前期不要用,背完整命令)

  4. 修改端口号以及创建server

    edit -> config

命令行与pycharm创建的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1 命令行创建django项目时,不仅要创建templates文件夹,还需要自己在setting.py中配置路径。
# -> settings.py
# pycharm创建
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
]
# 命令行创建
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
]

更快捷的Django命令

  • 这里的命令将拥有代码提示

image-20210615221710342

应用

django是一款专门用来开发app的web框架。

而这里的app指的是一种具体的功能模块。

1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config', # 全写
'app01', # 简写
]

创建出来的的应用第一步一定要先去settings.py中注册

工程文件介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-mysite项目文件夹
--manage.py django的入口文件
--db.sqlite3 django自带的sqlite3数据库(不用)
--mysite文件夹
---settings.py 配置文件
---urls.py 路由与视图函数对应关系(路由层)
---wsgi.py wsgiref模块(不考虑)
--app01文件夹
---admin.py django后台管理
---apps.py 注册使用
---migrations文件夹 数据库迁移记录
---models.py 数据库相关的 模型类(orm)
---tests.py 测试文件
---views.py 视图函数(视图层)

静态文件配置

Templates

  • 将html文件默认都放在 Templates文件夹下

Static

  • 将网站所使用的静态文件放在Static文件夹下

这里的静态文件指前端已经写好了的,能够直接调用的文件。包括 js、css、.jpg、第三方前端框架等。

Django不会自动创建static文件夹,需要手动创建

访问静态文件

如果访问不到资源,则一定说明后端没有开设该资源的接口。

在写django项目的时候,可能会出现后端代码修改了,但是前端页面没有变化的情况。那么可能原因有:

  1. 在同一个端口开了好几个django项目,而一直在跑的其实是第一个django项目

  2. 浏览器缓存的问题。勾选 settings -> network -> disable cache

静态文件访问令牌

想要调用静态文件,则文件地址必须以 令牌(STATIC_URL) + 文件名 形式。

然后将在 STATICFILES_DIRS 注册的文件夹列表中从上往下依次非递归查找。

1
2
3
4
5
6
7
8
# -> settings.py
STATIC_URL = '/static/' # 访问静态文件的令牌

# 需要自己创建STATICFILES_DIRS,配置静态文件所在文件夹
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1')
]

同时也可以动态解析令牌

1
2
3
4
# 静态文件动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

在前期使用django提交post请求时,需要在settings中注释掉一行代码

1
2
3
4
5
6
7
8
9
10
# -> settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # 表示django全局发送post请求均需要字符串验证
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

数据库链接

Pycharm链接数据库

  • 需要提前创建好对应使用的mysql数据库文件
  • pycharm右侧上方database

Django链接数据库

  1. Django默认使用sqlite3,首先改settings
  2. Django默认使用mysqldb,需要改为pymysql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -> settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day60',
'USER': 'root',
'PASSWORD':'admin123',
'HOST':'127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8'
}
}

# -> 在项目名下或任意应用名下的init文件
import pymysql

pymysql.install_as_MySQLdb()