Django框架基础搭建经验分享
Django私人具体操作
1、Python Web开发
1.1 实验介绍
实验介绍了Python Web框架Django的使用,包括了框架的基础操作、ORM、模板语言、后台管理站点和建立框架时的错误操作。
1.2 实验目的
通过以下小的实验可以帮助我们掌握Django框架的基础使用及使用过程中可能出现的某些错误。
1.3 资源准备
安装Python开发环境。
安装Pycharm/VScode等IDE工具。
安装MySQL5.7数据库/华为云RDS数据库。
1.4 实验步骤
1.4.1 Django基础
步骤1 新建Django工程
-
方法一:使用命令创建Django工程
使用命令创建Django工程MyDjango:
django-admin startproject MyDjango
创建完成后使用IDE打开。
-
方法二:使用pycharm创建Django工程
pycharm左上角点击 文件-新建项目
点击Django,修改名称为你想命名的名称(MyDjango),并且点击下面按钮,点击Create。
创建成功。
步骤2 运行django自带的服务器
在命令行中输入命令:
python manage.py runserver
此处可能会报错,因为其默认端口号为8000,然而腾讯音乐打开时会使用这个端口。可以关闭腾讯音乐然后重新输入命令;或者切换端口号,这个有些繁复百度上有教程,在此就不详细写了。
处理完报错后,运行成功。
在浏览器中输入http://127.0.0.1:8000/:
成功界面。
默认的IP地址为127.0.0.1,默认的端口号为8000,可以在命令后面制定ip地址和端口号。
步骤3 创建应用
在命令行输入:
python manage.py startapp MyApp
创建成功。
步骤4 第一个视图hello world
在MyApp中的views.py文件中写入视图函数:
from django.http import HttpResponse
from django.shortcuts import render
# resqest请求接收HTTP请求,HttpResponse用来返回http响应
def hello(request):
return HttpResponse("hello world")
步骤5 配置路由文件urls.py
在应用MyApp中新建urls.py文件:
写入代码:
from django.conf.urls import url
from . import views # 导入view中的视图函数
urlpatterns = [
url('^$', views.hello), # 将视图函数与url进行匹配
]
在Django匹配路由时有三种方式进行匹配,分别时url、path和re_path。其中path只能绝对匹配路径地址,不支持正则匹配;re_path支持正则匹配;url支持正则匹配,实际上介绍return re_path。
在MyDjango中的urls.py中添加应用MyApp的urls.py地址。
#在顶部导入
from django.urls import include
path(r'',include('MyApp.urls')) # 为了方便url的管理,将一个应用中url集中在一起
运行Django工程:
python manage.py runserver
步骤6 模板的使用
创建模板文件夹,在工程根目录下新建文件夹templates:
在settings.py文件中添加模板文件夹路径:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(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',
],
},
},
]
为方便后续模板文件管理,对每一个应用新建一个文件:在templates文件夹中新建MyApp文件夹,并在MyApp文件夹中新建文件hello.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ hi }}</h1>
</body>
</html>
创建文件编写代码后,修改MyApp下view.py中的视图函数hello。
def hello(request):
# context 用来接收数据
# render 将context中的数据传递至模板并填充(渲染)
return render(request, "MyApp/hello.html", context={'hi': 'Hello world'})
修改完成后重新启动服务器查看运行结果:
python manage.py runserver
步骤7 使用模板语言
在模板中使用循环判断语句,在view.ps中添加视图函数:
def func(request):
L = ['flask', 'django', 'web.py']
return render(request, 'MyApp//hello.html', context={'L': L})
在MyApp中urls.py中添加对应路由:
url(r'^func$', views.func)
打开hello.html文件在body标签中添加以下代码
{{ L }}<br>
{% for num in L %}
{% if num != 'django' %}
{{ num }}<br>
{% endif %}
{% endfor %}
保存后重新启动服务,在浏览器中输入http://127.0.0.1:8000/func。
步骤8 数据模型类
在models.py中实现数据模型类Person,具备name和age属性。
from django.urls import reverse
from django.db import models
from django.contrib.auth.models import User
class Person(models.Model):
def __str__(self):
return self.name
name = models.CharField(max_length=10, null=False, unique=True) # 名称:字符型,最大长度10
# null 表示可以使用null填充,默认为False,不能用null填充
age = models.IntegerField(default=18)
编写完成后进入settings.py文件中修改数据库配置信息:
连接的数据库类型
-
mysql数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 数据库主机IP地址
'PORT': 3306, # 数据库端口
'USER': 'root', # 数据库用户名
'PASSWORD': '12345678', # 数据库用户密码
'NAME': 'mydjango' # 数据库名字,需要先创建好
}
}
步骤1:安装MySQL数据库
步骤2:下载MySQL可视化工具SQLyog
SQLyog的下载、安装、破解、配置(MySQL可视化工具安装)
步骤3:SQLyog连接上MySQL
主机地址:localhost
用户名:root
密码:12345678
端口:3306(与SQL Sever的端口不一致)
此上步骤 步骤2中连接文档内有详细步骤
步骤4:Django框架连接MySQL
运行Django工程
python manage.py runserver
运行失败!
问题:出现报错说缺少mysqlclient模块。
通过Did you install mysqlclient?寻找解决办法
django连接MySQL报错Did you install mysqlclient?_
根据此文章了解了Django连接数据库的报错原因:
Django连接 MySQL 时仍默认使用 MySQLdb 驱动,但 MySQLdb 并不支持 Python3,所以需要手动在项目中进行配置。
在Django项目中,加入以下代码。(不是App项目,该图弄错了)
import pymysql pymysql.install_as_MySQLdb()
根据此文章了解了pymysql模块,但是我心里有个疑问pymysql模块和mysqlclient模块有啥区别嘞?
于是又找到了下述文章。
mysqlclient和pymysql如何选择?_gevent_waiter的使用__mysqlclient pymysql
步骤5:Django框架连接MySQL-2配置时区
在执行步骤4时,我们也想了是不是配置数据库信息错误了,于是进行数据库重配置,发现数据库的时区错误,没有修改为中国时区,应该是使得其与搭建的Django框架冲突,不过本人不确定是不是这个原因。
Django连接数据库设置中,显示错误。
初步排查,可能是pycharm的时区和MySQL时区没统一导致(Django是通过pycharm搭建的)
处理方法:
在SQLyog或者MySQL中输入(SQL语句):
SET GLOBAL time_zone='+8:00';
时区统一后尝试启动Django框架,启动成功。
- sql_server数据库
DATABASES = {
'default': {
'ENGINE': 'sql_server.pyodbc', # odbc连接固定写法
'NAME': 'MyDjango', # 自定义数据库连接名(必须创建数据库后才可连接上去)
'USER': 'sa', # 数据库连接账户
'PASSWORD': '12345678', # 数据库连接密码
'HOST': '127.0.0.1', # 数据库服务地址
'PORT': '1434', # 数据库连接端口
'OPTIONS': {
'driver': 'SQL Server Native Client 11.0', # ODBC连接应用驱动
'MARS_Connection': True,
}
}
}
本人最初是使用sql_server数据库,但是最终的admin模块不支持sql_server数据库所以修改连接为mysql数据库
不过连接操作,放在下面:
连接操作:Django连接使用SQL Server数据库(windows版)或者Django连接SQL Server数据库
查询端口号:如何查看SQL Server的端口号
登录操作:SQL Server 2008 R2用户'sa'登录失败
django框架本身不太支持SQL Server数据库,所以需要很多其他操作,最终控制效果还行,不过还是不太建议使用。
步骤9 数据迁移
执行命令生成迁移文件:
python manage.py makemigrations
迁移成功后会生成迁移文件:(可能没有任何反应)
没有反应的话在setting.py中找到INSTALLED_APPS在里面加入一段APP注册信息:
'MyApp.apps.MyappConfig'
在执行命令生成迁移文件:
同步至数据库:
python manage.py migrate
迁移完成后打开数据库查看生成的数据表。
步骤10 ORM操作
通过Django中携带的shell命令行来测试ORM操作。
python manage.py shell
在命令行中输入命令:
from MyApp.models import Person
Person.objects.create(name="李四",age=21)
p=Person(name="张三",age=20)
p.save()
错误:1366 Incorrect string value: ‘\xE6\x9D\x8E\xE5\x9B\x9B‘ for column ‘name‘ at row 1
在执行上述命令时,如果出现上述报错,参见 错误代码: 1366 Incorrect string value: ‘\xE6\x9D\x8E\xE5\x9B\x9B‘ for column ‘name‘ at row 1文章内容。
原因是因为数据库的字符集可能不为utf8所以出现无法识别。
在创建数据库时记得选中utf8
执行完成后打开数据库查看插入的数据:
继续插入以下数据:
Person.objects.create(name="王五",age=17)
Person.objects.create(name="赵六",age=19)
执行ORM查询操作:all(),查询所有数据。
Person.objects.all()
结果:
<QuerySet [<Person: 李四>, <Person: 张三>, <Person: 王五>, <Person: 赵六>]>
get():查询单一结果:
Person.objects.get(name="张三") # <Person: 张三>
过滤查询:
Person.objects.filter(id=2) # <QuerySet [<Person: 张三>]>
# contains表示是否包含
Person.objects.filter(name__contains="三") # <QuerySet [<Person: 张三>]>
# startswith、endswith以指定值开头或结尾
Person.objects.filter(name__startswith="李") # <QuerySet [<Person: 李四>]>
Person.objects.filter(name__endswith="三") # <QuerySet [<Person: 张三>]>
# isnull:是否为null,根据字段是否为null值进行查询
Person.objects.filter(name__isnull=False)
# <QuerySet [<Person: 李四>, <Person: 张三>, <Person: 王五>, <Person: 赵六>]>
# in:是否包含在范围内
Person.objects.filter(id__in=[1,3]) # 查询id在[1,3]内的数据
# <QuerySet [<Person: 李四>, <Person: 王五>]>
# gt:大于(greater then)
Person.objects.filter(id__gt=2) # 查询id大于2
# <QuerySet [<Person: 王五>, <Person: 赵六>]>
# lt:小于
Person.objects.filter(id__lt=2)# 查询id小于2
# <QuerySet [<Person: 李四>]>
from django.db.models import Q
# Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或
Person.objects.filter(Q(name__startswith="张")|Q(age__gt=18))
# <QuerySet [<Person: 李四>, <Person: 张三>, <Person: 赵六>]>
from django.db.models import Sum
Person.objects.aggregate(Sum("age")) # {'age__sum': 77}
Person.objects.all().order_by("id")
# <QuerySet [<Person: 李四>, <Person: 张三>, <Person: 王五>, <Person: 赵六>]>
#修改数据
p=Person.objects.get(name="李四")
p.name="小李"
# Person.objects.get(name="李四").update(name="小李")
#删除数据
Person.objects.get(name="王五").delete()
步骤11 Admin
创建管理员账号:
python manage.py createsuperuser
在创建管理员用户时,有许多安全限制:密码不能全为数字、密码长度不能低于8位、密码不能和账号一样等。
账号:root
密码:220081db
启动服务器:
python manage.py runserver
启动服务进入管理页面(http://127.0.0.1:8000/admin)
输入账号密码:
界面显示为英文,修改配置文件settings.py改变语言选项。
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
重新启动服务进入管理界面
在重复的数据库操作中会使用到的操作:
1、MySQL数据库查询
SHOW DATABASES;
2、MySQL数据库删除
DROP DATABASE mydjangosql;