Django初识_续篇
本篇博客,主要是对Django项目文件中各类文件各级目录对大致介绍,以及ORM对初步使用介绍
1. settings.py文件介绍
# 配置项极其意义
# 项目的根目录路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# True为开启DEBUG模式,报错会提示某些信息;开发过程中常设为True
DEBUG = True
# 允许访问该Django项目web服务的主机,*代表所有IP可访问
ALLOWED_HOSTS = ['*']
# Django项目注册的APP,默认有内置的APP;若新建app后,需要在此注册(格式仿默认的)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
# Django项目中内置应用的中间件列表
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # CSRF保护机制默认不允许前端提交POST请求
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 指定路由文件,即指定url地址和函数对应关系的文件
ROOT_URLCONF = 'mysite01.urls'
# 模版的相关配置
# DIRS指定templates文件夹的路径(若命令行新建项目DIR可能就是空,需要自己新建template并配置文件)
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',
],
},
},
]
# WSGI相关配置,指定使用的WSGI
WSGI_APPLICATION = 'mysite01.wsgi.application'
# 数据库相关配置,默认是sqllite3文件型数据库;可以改成使用mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# 存放静态文件的,如css、JavaScript、images;是静态文件的别名
STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"), # 静态文件存放位置
]
2. Django基础必备三件套
from django.shortcuts import HttpResponse, render, redirect
2.1 HttpResponse
内部传入字符串参数,返回给浏览器
# 定义的应用函数需要传入request参数,是wsgi之前定义的
def index(request):
# 业务逻辑代码
return HttpResponse("OK")
2.2 render
除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。
将数据填充进模板文件,最后把结果返回给浏览器。
def index(request):
# 业务逻辑代码
return render(request, "index.html", {"name": "tom", "hobby": ["抽烟", "喝酒"]})
2.3 redirect
接受一个URL参数,表示跳转到指定的URL。
def index(request):
# 业务逻辑代码
return redirect("/home/")
2.4 request参数补充说明
request参数,是前端请求经过WSGI解析后,封装的一个类似字典的一个参数集合,包含了前端的请求信息,如请求的方式是POST还是GET,请求的内容又是什么等等;
我们定义的具体实现逻辑功能的函数,可以通过从request参数中获取前端请求的内容(如可以通过request.method方法来获取请求方式是POST还是GET),来实现返回对应内容的功能逻辑
可参考《wsgi博客》进一步理解
3. app的创建与注册
3.1 app的创建
# 于Django项目根目录下执行manage.py(注意你的python版本)
$ python3 manage.py startapp AppName
# 例如新建名为app01的app
$ python3 manage.py startapp app01
可以看到在项目根目录下新生成一个app01的文件夹
app创建成功
补充:
在通过pycharm新建Django项目时,也可以直接提前配置要创建的app;
如下图,在Application name处填写app的名称,创建项目后即可直接生成app的目录
3.2 app的注册
于此Django项目的全局配置文件settings.py
中的INSTALLED_APPS
配置项处,注册新创建的app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config', # 注册新创建的app01
]
3.3 app目录文件介绍
app目录结构
app01/ # APP目录,实现项目里具体的web应用服务
├── __init__.py
├── admin.py # Django提供的后台管理的工具,如管理数据库的表
├── apps.py # 此app的一些相关信息,注册时会用到
├── models.py # 定义表结构,然后迁移到数据库;ORM操作也会用到
├── tests.py # 测试用
├── views.py # 视图,即定义具体的实现功能的函数/类的所在地
└── migrations # 用于迁移数据库的文件所在,可将models.py定义的表迁移到数据库中
└── __init__.py
4. 路由文件简介urls.py
路由文件,可描述URL与具体实现该请求的函数/类之间的对应关系(即访问那个URL对应执行哪个函数);一个项目会有一个根URLconf文件
,同时每一个app文件夹下也有各自的URLconf文件
,可以通过路由分发(include)
来实现关联
# Django项目全局配置路径下的路由文件:urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views # 导入app01中的视图文件
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/',views.login), # 指定login/开头的URL对应views.py文件里的login函数
url(r'^index/',views.index),
]
# app01文件夹下的视图文件:views.py
from django.shortcuts import render,redirect
def login(request):
# 返回登录页面
return render(request,'login.html')
5. 模版文件介绍template
template模版文件夹下的模版文件,如在上述视图函数返回的login.html
另,模版文件是有自己的一套语法的,用于接收后段返回给前端的数据
# template目录下的login.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="" method="post">
<p>
用户名:<input type="text" name="user">
</p>
<p>
密 码:<input type="password" name="password">
</p>
{# <input type="submit" value="登录">#}
<button>登录</button>
</form>
{{ error }} {# 用于接收视图函数返回的错误信息 #}
</body>
</html>
6. 静态文件static
静态文件夹下,存放css、js、images等文件
static目录结构
mysites/
└── static # 静态文件目录
├── css # 存放自写的css文件
├── js # 存放自写的js文件
├── images # web需要引用的图片文件
└── plugins # 如bootstrap等定义好的框架、插件、模版
static相关配置(settings.py文件中)
# 存放静态文件的,如css、JavaScript、images;是静态文件的别名
STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"), # 静态文件存放位置
]
7. 视图函数简介views.py
视图函数views.py里,定义了具体实现的web功能的函数/类,这些函数可以根据前端传过来的请求来判断返回哪个html页面,并附带哪些数据信息
from django.shortcuts import render,redirect
def index(request):
return render(request,'index.html')
def login(request):
# 返回登录页面
if request.method == 'POST': # 如果请求方式是POST
# print(request.POST) # <QueryDict: {'user': ['admin'], 'password': ['admin123']}>
user = request.POST.get('user') # 取request里封装的user信息
pwd = request.POST.get('password')
if user == 'admin' and pwd == 'admin123.': # 判断账号密码是否正确,正确则跳转之index的URL
return redirect('/index/') # 也可以直接重定向到其他连接,如www.baidu.com
return render(request,'login.html',{'error':'用户名或密码错误,请重试'})
return render(request,'login.html')
**注:**视图系统分为FBV和CBV两种实现方式,F即function,C即Class;通常会用CBV方式实现
8. ORM简介与使用
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象和关系数据库存在的互不匹配的现象的技术
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。即程序通过操作对象而进一步转化成对数据库的操作,不用再写sql了
具体内容参考博客《ORM介绍与使用》
1)配置settings.py文件
配置settings.py文件中关于数据库的配置信息,达到连接数据库的目的
# 配置db信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangoblog',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'root'
}
}
# 用pymysql替换MySQLdb模块进行数据库的连接(因为mysqldb模块只能在py2.X版本用)
# 注:以下部分,通常放在项目的setting.py文件同级目录的__init__.py文件中
import pymysql
pymysql.install_as_MySQLdb()
init.py文件
# 用pymysql替换MySQLdb模块进行数据库的连接(因为mysqldb模块只能在py2.X版本用)
import pymysql
pymysql.install_as_MySQLdb()
2)models.py
在modesl.py文件中定义表结构(ORM模式的)
from django.db import models
# 定义一个user表,里面有两个字段(username、password),且字段的类型是varchar,最大长度是32
class User(models.Model):
username = models.CharField(max_length=32) # varchar(32)
password = models.CharField(max_length=32) # varchar(32)
3)数据库迁移
即将表结构的变化同步到数据库中
# 制作迁移文件,表示之后要做的操作;会在migrations文件夹下生成一个0001_initial.py的文件
$ python3 manage.py makemigrations
# 执行具体的迁移动作
$ python3 manage.py migrate
# 数据库中会生成一个app01_user的表
mlgdeMacBook-Pro:mysite01 mlg$ python3.5 manage.py makemigrations
Migrations for 'app01':
app01/migrations/0001_initial.py
- Create model User
mlgdeMacBook-Pro:mysite01 mlg$ python3.5 manage.py migrate
Operations to perform:
Apply all migrations: admin, app01, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying app01.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK
mlgdeMacBook-Pro:mysite01 mlg$
4)数据库可看到生成的表
补充1:0001_initial.py文件内容
# -*- coding: utf-8 -*-
# Generated by Django 1.11.25 on 2020-01-30 09:28
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('username', models.CharField(max_length=32)),
('password', models.CharField(max_length=32)),
],
),
]
补充2:pycharm作为连接数据库的客户端
5)ORM查询数据
from app01 import models
ret = models.User.object.all() # QuerySet 对象列表,里面的元素是对象,一个对象对应一行数据
# 其中models.User.object是一个固定写法,对应了User表,后面可以通过具体的操作来获取表中的数据
print(ret,type(ret))
'''输出
<QuerySet [<User: User object>, <User: User object>]> <class 'django.db.models.query.QuerySet'>
'''
# 可以通过遍历对象列表中的对象,然后通过".属性名"对方式取具体的字段内容
如,在user表中插入了admin/admin123和root/root 两条数据后,再在index视图函数中增加获取user表中数据的逻辑,如下:
from django.shortcuts import render,redirect
from app01 import models
def index(request):
ret = models.User.objects.all()
for i in ret:
print(i.username,i.password,type(i.username))
return render(request,'index.html')
'''输出
admin admin123 <class 'str'>
root root <class 'str'>
'''
补充:其他获取/校验数据的操作方法
ret = models.User.object.get(username='admin',password='admin123') # get只能返回一条满足条件的数据,若有多条满足,则报错
ret = models.User.object.filter(password='root') # 可以返回所有满足条件的对象(组成的对象列表)
登录视图函数应用ORM
from django.shortcuts import render,redirect
from app01 import models
def index(request):
pass
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('password')
if models.User.objects.filter(username=user,password=pwd):
return redirect('/index/')
return render(request,'login.html',{'error':'用户或密码错误,请重试'})
return render(request,'login.html')