前言

最近抄了个html+css+js实现的影视页面,想用后端实现动态加载内容,但是学习时间不够。之前毕设用到了Django,所以打算重新捡起之前的知识,用Django作为影视网站的后端(还自带后台管理系统),顺便做好笔记防止再次遗忘。

本篇参考教程:20分钟快速用django+mysql+pycharm搭建一个自己的web网站

环境准备

Django的使用需要用到Python、Pycharm、MySQL、Navicat(可选)等。

Python 3.12.2

官网地址:https://www.python.org/

下载:打开官网->点击downloads -> all releases -> 选择版本,点击download(旧版本3.10不支持下载了,目前最新为3.12.2版本)->在下方的Flies里选择Windows installer (64-bit) 【点此下载】

安装:打开安装包 -> 勾选下面两个配置,选择Customize installation->点击Next,自定义安装位置,点击Disable Path Length Limit。

注意:自定义路径记得多加上一层文件夹,安装完别移动,否则自动添加的环境变量可能失效,安装程序也无法卸载移动后的程序。

在cmd中,输入 pythonpip -V,如果能看到版本信息则配置成功。

1
2
3
4
5
6
C:\Users\Administrator>pip -V
pip 24.0 from D:\Program Files\Python\Python312\Lib\site-packages\pip (python 3.12)
C:\Users\Administrator>python
Python 3.12.2 (tags/v3.12.2:6abddd9, Feb 6 2024, 21:26:36) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

PyCharm Community Edition

官网地址:https://www.jetbrains.com/pycharm/

下载:打开官网,点击Download,滑动到下方,下载PyCharm Community Edition(社区版免费使用),点此下载

安装:打开安装包->自定义安装路径,全勾选,安装即可

MySQL 8.3.0

官网地址:https://www.mysql.com/

下载:点击此链接 下载最新版msi文件

安装:请阅读 全网最简单的Mysql 8.3 安装及环境配置教程

  • 安装:双击,Typical,…选择安装路径…密码建议root,Sample Databases可选勾选创建,点击Copy Log to Clipboard,Finish。
  • 配置:按win键打开MySQL并登录。win+R 打开services.msc,找到并双击MySQL83,复制到bin路径。按win搜编辑系统环境变量,修改环境变量,在系统变量-path中添加刚才复制的bin路径,三次确定完成配置。按win搜cmd,管理员身份打开,输入mysql -V显示版本则安装成功。

Navacat 16

Navicat用来可视化操作数据库数据。

脚本之家破解版安装教程:https://www.jb51.net/database/710931.html

创建Django项目

打开终端,cd进入自定义的Django文件夹

1
2
3
mkdir D:\Coding\djangoProject
D:
cd D:\Coding\djangoProject

安装虚拟环境工具:

1
pip install virtualenv

创建虚拟环境:

1
virtualenv env

激活虚拟环境(虚拟环境env会自带python和pip):

1
env\scripts\activate

不创建虚拟环境则 pip install 默认会安装到 G:\python-3.10.3\Scripts

使用虚拟环境的好处是每个项目有各自相互隔离的独自的依赖库,不会相互影响,并且能将项目与其环境隔离开来方便管理。

创建的env自带python和pip工具

在env中安装Django:

1
pip install django

创建Django项目:

1
django-admin startproject mysite

停用虚拟环境:

1
env\scripts\deactivate

env文件移动到D:\Coding\djangoProject\mysite里,用Pycharm打开mysite文件夹。

在左下角打开Terminal(注意左侧是否有env启动标志),输入命令启动项目:

1
python manage.py runserver

在浏览器打开http://127.0.0.1:8000/,能看到小火箭则项目成功启动。在下方可以查看文档和官方入门教程。

在Terminal中按ctrl + c可关闭项目。

【小火箭的图】

创建自己的网站应用

打开settings.py,在最下方设置语言和时区

1
2
3
LANGUAGE_CODE = 'zh-hans' 

TIME_ZONE = 'Asia/Shanghai'

Django项目由多个应用组成,每个应用负责一个业务。这里创建movies应用,负责影视网站的业务。

创建APP:

1
python manage.py startapp movies

在settings.py中注册APP:

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [      # 都是Django内置的一些功能,依赖于Django的表
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'movies.apps.MoviesConfig', # 注册movies应用,逗号别漏了
]

修改mysite的urls.py文件内容如下:

1
2
3
4
5
6
7
8
# mysite/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('movies/', include('movies.urls')),
]

新建movies的urls.py内容如下:

1
2
3
4
5
6
7
# movies/urls.py
from django.urls import path
from . import views

urlpatterns = [
path('', views.toLogin_view ), # 默认进入toLogin_view视图
]

修改movies的views.py内容如下:

1
2
3
4
from django.shortcuts import render

def toLogin_view(request):
return render(request, 'login.html')

创建模板:在movies文件夹下创建templates文件夹用来存放模板

编写模板:在templates模板下创建login.html并编写登录界面

1
2
3
4
5
6
7
8
9
10
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form>
<p>这是一个登录网站</p>
</form>
</body>
</html>

配置模板路径:在settings.py的TEMPLATES的DIR一行改为:

1
'DIRS': [os.path.join(BASE_DIR, 'templates')],

并在顶部添上import os防止报错

此时启动项目,打开http://127.0.0.1:8000/movies/ 能看到login.html页面

MTV概念

MTV 是 Django 框架中的一个核心概念,它是一种基于模型(Model)、模板(Template)、视图(View)的设计模式,用于构建 Web 应用程序,与MVC模式相近。

简单来讲:

  • 模型(Model):定义数据结构和行为,通常由 Python 类表示,与数据库中的表相对应。
  • 视图(View):处理用户请求的逻辑,接收 HTTP 请求并返回 HTTP 响应,负责将模型和模板之间的交互结合起来。
  • 模板(Template):表示用户界面的呈现,包含 HTML 结构和 Django 模板语言,用于动态地将数据呈现给用户。

【MTV的图】

在上面的例子中,浏览器访问网站时,通过mysite的urls匹配到’/movies’,转到movies的urls中,匹配到’’,通过movies的views中的toLogin_view视图来处理请求逻辑,即渲染login.html并返回给浏览器,由于还没用到数据库,所以没有涉及Model。

ORM概念

Django引入了ORM的概念(全称Object Relational Mapping,即对象关系映射),对于与数据库的交互,我们无需再去编写原生sql,取代代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将Model里的Python代码转换/映射成为 SQL 语句,SQL 语句通过 pymysql 传送到数据库服务端,在数据库中执行 SQL 语句并将结果返回。

了解相关知识请阅读:Django之ORM

【ORM的图】

通过编写Model的代码,ORM框架自动将代码转换为对应的sql语句。开发人员无需考虑SQL的优化和数据库迁移问题,ORM都帮我们做好了优化且支持多种数据库,大大的提升了开发效率。

连接到MySQL数据库

通过pymysql模块连接

1.安装pymysql模块

左上角Main Menu->File->Settings-> Project: mysite -> Python Interpreter,这里可以看到当前项目的env里已安装的依赖

+号 -> 输入pymysql -> 点击下方install package

(以上两步也可以在Terminal里输入 pip install pymysql实现)

2.生成数据库

打开Navicat->连接->MySQL,连接名自定义,密码为root,确定。双击连接名激活后Navicat成功连接MySQL

右击连接名,新建数据库,库名 mysite,字符集 utf8mb3,排序规则utf8_general_ci(库内不区分大小写)

(以上两步也可以打开MySQL Command Line Clint通过create database mydb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;指令创建数据库)

3.Django连接MySQL数据库

修改项目文件mysite/settings.py中DATABASES的内容,设置连接MySQL数据库(Django默认使用的是sqllite数据库)

1
2
3
4
5
6
7
8
9
10
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}

修改 mysite/init.py 文件,告诉Django使用 pymysql 模块连接MySQL数据库

1
2
import pymysql
pymysql.install_as_MySQLdb()

这样mysite项目就连接上了MySQL中的 mysite 数据库。在Terminal中按ctrl+c先关闭正在运行的项目

(以上还可以用mysqlclient模块连接,似乎效果更好)

4.数据迁移,创建管理员账号并进入后台

然后执行迁移,将项目中原有的应用的模型同步迁移到数据库

输入 py manage.py migrate ,此时就把项目中自带的应用的模型映射到了数据库中

输入 py manage.py createsuperuser 创建项目的管理员账号(默认账户名为administrator)

重新启动项目,输入网址:http://127.0.0.1:8000/admin 就进入了Django自带的后台登录界面

设计模型、模板和视图

前面创建项目并连接上数据库,可以成功进入登录界面

接下来就是设计登录注册界面及其业务逻辑

直接贴代码:

login.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/movies/index/" method="post">
{% csrf_token %}
<p><label>用户名: </label><input name="user"/></p>
<p><label>密码: </label><input name="pwd"/></p>
<input type="submit" value="登录">
<a href="/movies/to_register/">注册</a>
</form>
</body>
</html>

register.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/movies/register/" method="post">
{% csrf_token %}
<p><label>用户名: </label><input name="user"/></p>
<p><label>密码: </label><input name="pwd"/></p>
<input type="submit" value="注册">
</form>
</body>
</html>

csrf 全称是 Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。需要在form表单里加上。

movies/urls.py

1
2
3
4
5
6
7
8
9
from django.urls import path
from . import views

urlpatterns = [
path('', views.toLogin_view ),
path('index/', views.Login_view ),
path('to_register/', views.toRegister_view ),
path('register/', views.Register_view ),
]

movies/models.py

1
2
3
4
5
6
from django.db import models

class UserInfo(models.Model): # Django的Model在MySQL数据库中其实就是一张数据表
user_id = models.CharField(primary_key=True, max_length=20,)
user_name = models.CharField(max_length=20)
user_pwd = models.CharField(max_length=20)

执行指令,将数据模型迁移到数据库:

1
2
3
py manage.py makemigrations polls

py manage.py migrate

此时,用Navicat查看,mysite数据库中会多出一张movies_userinfo表

往里面输入数据,登录时会将账号密码与表内数据进行配对,不正确则无法登录

注册时,正确输入账号密码后,会在表内增加一条数据。

movies/views.py

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
26
27
28
29
30
31
32
33
34
35
36
from django.http import HttpResponse
from django.shortcuts import render
from .models import *

# 渲染登录界面
def toLogin_view(request):
return render(request, 'login.html')

# 点击登录后做的逻辑判断
def Login_view(request):
u = request.POST.get("user",'')
p = request.POST.get("pwd",'')

if u and p:
c = UserInfo.objects.filter(user_name = u, user_pwd = p).count() # 能获取的数据的条数
if c >= 1:
return HttpResponse("登录成功!")
else:
return HttpResponse("账号密码错误!")
else:
return HttpResponse("用户名或密码不能为空!")

# 渲染注册界面
def toRegister_view(request):
return render(request, 'register.html')

# 点击注册后做的逻辑判断
def Register_view(request):
u = request.POST.get("user", '')
p = request.POST.get("pwd", '')
if u and p:
user = UserInfo(user_name = u, user_pwd = p)
user.save()
return HttpResponse("注册成功!")
else:
return HttpResponse("请输入完整的账号和密码!")

视图显示和请求处理都分成两个函数处理。

最后,启动项目,进入 http://127.0.0.1:8000/movies/ 查看效果

以上是所有内容:

  1. 创建Django项目
  2. 连接mysql 并创建数据库
  3. 设计登录注册界面并且能和数据库交互进行判断

Django的模型可以映射到数据库中。反过来,数据库也可以反映射到model.py中输入指令:py manage.py inspectdb > movies/models.py

然后打开model.py可以看到,数据库中的数据表输出为Model