1、Django框架的使用
1.1、安装Djnago Web框架
使用pip安装,命令如下
pip install django == 2.2 # 安装 2.2版本的Django
1.2、什么是virtualenv及windows下如何配置
virtualenv是一个创建隔绝的Python环境的工具。virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包。简单的说就是一个隔绝的python环境,在开发不同的程序的时候,往往需要在不同的环境下开发,每个应用可能需要各自一套"独立"的运行环境, virtualenv就是为此而生,用来创建一套这样的"隔离"的运行环境. virtualenv其操作简单,在大多数IDE中能容易的嵌合。最简单的说法就是Virtualenv 是Python中的虚拟环境管理工具。
windows下如何配置virtualenv,参考这篇文章
1.3、创建Django项目
1.31、使用django-admin命令创建项目
django-admin startproject demo
创建完成后,有以下几个文件
文件说明
文件 | 说明 |
---|---|
manage.py | Django程序执行入口 |
db.sqlite3 | SQlite的数据库文件,Django默认使用这种小型数据库存取数据,非必须保留 |
template | Django生成的HTML模板文件夹,我们也可以在每个App中使用模板文件夹 |
demo | Django生成的和项目同名的配置文件夹 |
setting.py | Django总的配置文件,可以配置App、数据库、中间件等选项 |
urls.py | Django默认的路由配置选项 |
wsgi.py | Django实现的WSGI接口的文件,用来处理Web请求 |
1.32、运行项目
使用以下命令
python manage.py runserver
然后根据提示可得web服务器已经在监听8000端口的请求。在浏览器中输入http:/127.0.0.1:8000就可以看到创建的Django项目界面。
1.33、创建数据表及账号密码
使用以下命令
python manage.py migrate # 执行数据库迁移生成的数据表
python manage.py createsuperuser # 按照提示输入账号密码,密码强度符号一定要求
然后重启启动服务器,在浏览器中访问http:/127.0.0.1:8000/admin,使用刚刚创建的账号密码就可以登入后台
1.4、创建App
在命令行使用以下代码
python manage.py startapp app1
demo目录里会多了app1目录
Django项目中App目录的文件说明
文件 | 说明 |
---|---|
migrations | 执行数据库迁移生成的脚本 |
admin.py | 配置数据库迁移生成的脚本 |
apps.py | 单独配置添加的每个App的文件 |
models.py | 创建数据库数据模型对象的文件 |
tests.py | 用来编写测试脚本的文件 |
views.py | 用来编写视图控制器的文件 |
接下来将创建的APP添加到demo目录下的setting.py配置文件里,将其激活(否则APP目录不生效)
激活命令如下
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1',
]
1.5、数据模型(models)
1.51、在App中添加数据模型
在app1的models.py中添加以下代码
from django.db import models
# Create your models here.
class Person(models.Model):
"""
编写Person模型类,数据模型应该继承models.Model或者其子类
"""
# 第一个字段使用models.CharFiles类型
first_name = models.CharField(max_length=30)
# 第二个字段使用models.CharFiles类型
last_name = models.CharField(max_length=30)
Person模型中的每一个属性都指明了models下面的一个数据类型,代表了数据库中的一个字段。上面的类在数据库中会创建以下的表:
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
1.52、执行数据库迁移
在完成数据库模型的建立后,我们希望使用mysql数据库,而不是Django自带的SQLite数据库。我们要使用MySql数据库,需要进行一下操作
1、进行setting.py配置
把下面代码注释掉
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
然后再添加下面代码
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'demo', # 数据库名称
'USER': 'root', # 用户名
'PASSWORD': '密码',
}
}
2、连接mysql数据库,然后在mysql命令行中创建数据库
create database demo default character set utf8;
3、安装数据库驱动
pip install pymysql
4、在D:\Python\Webprojects\l_env\Scripts\demo\demo目录下的__init__.py文件的手行添加下面代码
import pymysql
pymysql.install_as_MySQLdb() # 为了将pymysql发挥最大数据库操作性能
5、生成迁移文件
python manage.py makemigrations
这边报错
raise improperlyconfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % database._version_)
然后在D:\Python\Webprojects\l_env\Lib\site-packages\django\db\backends\mysql目录下找到base.py文件,然后将下面代码注释
#if version < (1, 3, 3):
# raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
然后继续尝试又报错
File “%s\django\db\backends\mysql\operations.py”, line 146, in last_executed_query
query = query.decode(errors=‘replace’)
在同样的目录下,找到\operations.py文件,
注释下面2行代码
#if query is not none:
# query = query.decode(errors='replace')
6、迁移数据库,创建新表
python manage.py migrate
报错raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc
原因:
Django2.1不再支持MySQL5.5,必须5.6版本以上
查mysql版本和Django版本:
: show version()
:import django
解决办法
二选一
(1)Django降级到2.0
pip install Django==2.0.0 -i https://pypi.douban.com/simple
(2)MySQL升级
参考:http://www.cnblogs.com/yebaofang/p/9863678.html
1.53、了解Django数据API
这里所有的命令都是在Django的交互命令行中执行。
在项目根目录下,启用交互命令行
python manage.py shell
导入数据模块
from app1.models import Person, Order # 导入Person, Order模块
创建数据方法1
p = Person(first_name="hugo",last_name="张")
p.save() # 必须调用save()才能写入数据库
方法2
p = Person.objects.create(first_name="hugo",last_name="张")
查询数据方法
Person.objects.all() # 查询所有数据
Person.objects.get(first_name="hugo") # 查询单个数据,get方法只能返回一个确定值
查询指定条件的数据
Person.objects.filter(first_name__exact="hugo") # 指定first_name字段值必须为hugo
Person.objects.filter(first_name__iexact="hugo") # 不区分大小写
Person.objects.filter(id_get=1) # 查找所有id值大于1
Person.objects.filter(id_lt=100) # 查找所有id值小于100
# 排除所有创建时间大于现在的时间的,exclude的用法与filter正好相反
Person.objects.exclude(created_at__gt=datetime.datetime.now(tz=datetime.timezone.utc))
# 过滤出所有first_name中包含h的字段,然后将查询结果按照id进行排序
Person.objects.filter(first_name__contains="h").order_by('id')
# 查询所有first_name中不包含h的字段
Person.objects.filter(first_name__icontains="h").order_by('id')
修改数据前需要先查询数据
p = Person.objects.get(first_name="hugo")
然后开始修改数据
p.first_name = "john"
p.last_name = "wang"
p.save()
或者
p, is_created = Person.objects.get_or_create(
first_name = "hugo",
defaults={"last_name":"wr"}
)
删除数据同样需要先找到对应的数据,然后进行删除
Person.objects.get(id=1).delete()
(1,({'app1.Person':1}))
一般情况我们不会直接删除数据,而是在数据模型定义的时候加个status参数,值为True或者False,用来标记是否可用,True为可用
1.6、路由(urls)
1.61、Django的URL路由流程如下
1、Django查找全局urlpaterns变量(urls.py)
2、按先后顺序对URL逐一匹配urlpaterns每个元素
3、匹配到第一个时停止查找,然后执行对应的处理函数
4、如果没有匹配到或出现异常,则由Django进行错误处理
1.62、Django支持的3种表达格式
1、精确字符串格式,如articles/1/。
一个精确URL匹配一个操作函数;最简单的形式,适合对静态URL的响应;URL字符串以“/”结尾,而不是开头。
2、Django的转化格式:<类型:变量名>,如articles/<int:year>/
Django转化后的格式是一个URL的模板,匹配URL的同时在其中获得一批变量作为参数是一种常用的形式。目的是通过URL进行参数的获取和匹配
格式转化类型说明表
格式转化类型 | 说明 |
---|---|
str | 匹配除分隔符(“/”)外的非空字符,默认类型<year> 等价于<str.year> |
int | 匹配0和正整数 |
slug | 匹配字母、数字、横杆、下划线组成的字符串,str子集 |
uuid | 匹配格式化的UUID(UUID,通用唯一识别码,是由一组32位数的16进制数字所构成,可以产生一个号称全球唯一的ID,可以用来命名文件、变量以及数据库的ID主键等属于唯一的元素。) |
path | 匹配任何非空字符串,包括路径分隔符,是全集 |
1.63、Django支持正则表达式格式
这种情况下,前面必须是re_path函数,表达式必须是str格式,有2种使用形式
1、不提取参数:如“re_path(articles/([0-9]{4})/)”
,表示4位数字,每一位都是0到9的任意数字
2、提取参数:命名格式为“(?p<name>pattern)”
,如“re_path(articles/(?p<year>)[0-9]{4}/)”
,将正则表达式提取的4为数字,每一位都是0-9的任意数字,命名为year。
未完待续。。。。。。
1.7、表单(forms)
在app1的文件下创建forms.py文件,添加下面代码
from app1 import views as app1_views
from django.urls import path, include
urlpatterns = [
path('get_name', app1_views.get_name)
]
在views.py中编写
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from app1.forms import PersonForm
# Create your views here.
def get_name(request):
# 判断请求方法是否为POST
if request.method == 'POST':
# 将请求数据填充到PersonForm实例中
form = PersonForm(request.POST)
# 判断form是否为有效的表单
if form.is_valid():
# s使用form.cleaned_data获取请求数据
first_name = form.cleaned_data_data['first_name']
last_name = form.cleaned_data_data['last_name']
# 响应拼接后的字符串
return HttpResponse(first_name + '' + last_name)
else:
return HttpResponseRedirect('/error/')
# 请求GET方法
else:
return render(request, 'name.html', {'from': PersonForm})
把URl添加到按app1/urls.py中
path('get_name', app1_views.get_name)
在demo/urls.py中添加
path('app1/',include('app1.urls'))