reference: datawhale
http
Django简介
Django是一个高度抽象的Python Web框架,最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发。
Django提供了对象关系映射(ORM, Object-Relational Mapping),可以通过Python代码来描述数据库结构。 通过数据模型语句来描述数据模型,并通过makemigrations及migrate等命令行工具自动生成数据模型迁移脚本并 自动创建数据库表。同时ORM屏蔽了底层数据库,大多数情况下,一套ORM模型可以运行在多种主流的关系型数据库上(如MySQL或PostgreSQL)。
通过定义URL规则及视图映射,Django可以方便的将URL路径与视图进行关联,并将Python代码与URL进行解耦。同时URL中的 宏将会以参数的形式传递给视图函数。
Django还提供模板功能,通过结合Python对象与模板文件,Django可以渲染出静态HTML文件并作为HTTP请求的返回内容。 (在本课程中使用前后端分离理念,未使用模板)
Django提供丰富的接口及扩展功能,拥有完善的社区及众多的三方扩展应用,可以极大简化开发过程,对于中小型项目可以 较大程度简化开发。
创建第一个Django项目
创建项目
在pycharm中安装好django后,输入django-admin startproject myweb创建名为myweb的项目,
创建项目中有
├── manage.py
├── myweb
| ├── init.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
- manage.py是服务入口,通过该脚本可以与Django项目进行交互。通过运行python manage.py可以看到支持的命令,
常用的命令有:
• runserver 启动后端服务
• makemigrations 生成数据库迁移脚本
• migrate 更新数据库schema
- myweb为项目目录,主要包括配置及后端路由
• settings.py 项目配置,包括应用配置、中间件、数据库、缓存、日志等
• urls.py URL与View的关联配置,通过urlpatterns配置URL至处理函数或者类的映射关系
• wsgi.py及asgi.py 使用WSGI或ASGI入口部署应用
- 使用python manage.py startapp <APP_NAME>创建应用,在setting中配置
INSTALLED_APPS = [
# …
‘<APP_NAME>’,
]
其中的关键文件如下:
• admin.py - 注册model至django admin应用(本次课程不涉及)
• apps.py - app级别配置文件
• models.py - 数据库对象关系映射
• tests.py - 测试
• views.py - Views,展示相关
• migrations - 自动生成的数据库表迁移脚本
社区版pycharm遇到问题解决
cannot find templates
解决:在setting.py里把空的’DIRS’改成
‘DIRS’: [os.path.join(BASE_DIR,‘templates’)],
各文件配置
url.py配置示例
url.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns=[
url(r'^index/',views.index) #第一个参数:路径正则字符串;第二个参数:对应的视图函数
]
无名分组: url(r'^books/(\d{4}/', views.books/),
位置参数: url('^books/(\d{4}/(\d{1,2})/',views.year_month_books),
有名分组: url('^books/?P<year>\d{4})/(?P<month>\d{1,2}/', views.year_month_books),
CBV: url(r'^login/',views.LoginView.as_view()),
view.py逻辑视图函数示例
from django.shortcuts import render,HttpResponse
def index(request):
print(request.method) #'POST', 'GET'
if request.method=='GET':
return render(request, 'login.html')
else:
print(request.POST)
username=request.POST.get('username')
password=request.POST.get('password')
if username=='estrella' and password=='123':
return HttpResponse('登录成功')
else:
return HttpResponse('登录失败')
ORM表单
表1
class Book(models.Model): #创建 book 表
title=models.CharField( max_length=30,unique=True, verbose_name='书名')
public=models.CharField(max_length=50,verbose_name='出版社')
price=models.DecimalField(max_digits=7,decimal_places=2,verbose_name='定价')
def default_price(self):
return '¥30'
retail_price=models.DecimalField(max_digits=7,decimal_places=2,verbose_name='零售价',default=default_price)
def __str__(self):
return "title:%s pub:%s price:%s" % (self.title, self.public, self.price)
class Author(models.Model): #创建作者表
name=models.CharField(max_length=30,verbose_name='姓名')
email=models.EmailField(verbose_name='邮箱')
def __str__(self):
return '作者:%s'%(self.name)
class UserInfo(models.Model): #创建用户信息表
username=models.CharField(max_length=24,verbose_name='用户注册')
password =models.CharField(max_length=24,verbose_name='密码')
表2
# 创建表
class UserInfo(models.Model):
# 定义chocies参数的对应关系,以元组(或者列表)的形式进行表述:
choices = (
(male, '男性'),
(female, '女性'),
)
gender = models.CharField(max_length=2,choices = choices,default='male')
通过执行如下命令
python manage.py makemigrations
python manage.py migrate
对 index 应用进行了数据库迁移工作,并且在数据库中创建了三张表,分别是 Author、Book、UserInfo。而且在 index 应用下的 migrations 目录下生还成了一个 0001_initial.py 的文件,文件的内容如下:
from django.db import migrations, models
import index.models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Author',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30, verbose_name='姓名')),
('email', models.EmailField(max_length=254, verbose_name='邮箱')),
],
),
migrations.CreateModel(
name='Book',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=30, unique=True, verbose_name='书名')),
('pub', models.CharField(max_length=50, verbose_name='出版社')),
('price', models.DecimalField(decimal_places=2, max_digits=7, verbose_name='定价')),
('retail_price', models.DecimalField(decimal_places=2, default=index.models.Book.default_price, max_digits=7, verbose_name='零售价')),
],
),
migrations.CreateModel(
name='UserInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('Username', models.CharField(max_length=24, verbose_name='用户注册')),
('password', models.CharField(max_length=24, verbose_name='密码')),
('gender', models.CharField(choices=[('M', '男性'), ('F', '女性')], default='M', max_length=2)),
],
),
]