框架介绍
1.什么是框架
框架就是程序的骨架,主体结构,也是个半成品。
2.框架的优缺点
可重用、成熟、稳健、易扩展、易维护
3.常见的框架
Django
web.py和Tornado
Flask和Bottle
4.web框架中的一些概念
MVC和MVT (model、view、template)
官方网址
The web framework for perfectionists with deadlines | Django
Django框架安装
pip3 install django==2.2.*
python -m django --version
查询pip3安装第三方库路径方式
pip3 show django
1)创建项目
django-admin startproject 项目名
2)运行开发服务器
进入manage.py文件的目录
python manage.py runserver
默认启动8000端口 ,在浏览器中输入127.0.0.1:8000,即可查看服务
启动8080端口
python manage.py runserver 8080
以上 启动方式只能本地访问
远程访问
在settings配置文件中设置,将ip加入ALLOWED_HOSTS中,*代表所有ip都可
ALLOWED_HOSTS = ["*"]
python manage.py runserver 0.0.0.0:8000
在浏览器中输入 ip:8000 即可访问
1)创建一个应用程序
python manage.py startapp app名
结构目录
myweb/
├── manage.py
├── myweb
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── myapp
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
admin.py 用于做后台的
apps.py 当前应用的
migrations 做数据库迁移操作的
models.py 做数据库操作类的
tests.py 做测试的
views.py 做试图的
2)编写视图
打开myapp/views文件
from django.shortcuts import render,HttpResponse
def index(request):
return HttpResponse('欢迎使用')
在myapp中创建urls.py 文件
from django.urls import path
from . import views
urlpatterns = [
path('',views.index,name='index'),
]
在myweb的urls.py中 导入include模块
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/',include('myapp.urls')),
]
过程:
浏览器输入localhost:8000 -----> myweb中的urls文件 ------> 通过include去myapp中urls -------> urlpatterns中path -------> 找到views对应视图
3)附录:path()函数介绍
Django path()可以接受四个参数,分别是两个必选参数:route、view和两个可选参数:kwargs、name。
1)连接MySQL数据库设置
在myweb/settings.py文件中,通过DATABASES项进行数据库设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydemo',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
}
}
其中ENGINE设置为数据库后端使用。内置数据库后端有:
- 'django.db.backends.postgresql'
- 'django.db.backends.mysql' MYSQL数据库
- 'django.db.backends.sqlite3'
- 'django.db.backends.oracle'
注意:
Django使用MySQL数据库需要加载 MySQLdb模块,需要安装 mysqlclient
pip install mysqlclient
如果命令安装不了,去以下地址, 选择自己对应的python版本和电脑位数
https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
2) 创建模型
在app文件中的models.py文件中
class Stu(models.Model):
'''自定义Stu表对应的Model类'''
#定义属性:默认主键自增id字段可不写
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)
age = models.SmallIntegerField()
sex = models.CharField(max_length=1)
classid=models.CharField(max_length=8)
# 定义默认输出格式
def __str__(self):
return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid)
# 自定义对应的表名,默认表名:myapp_stu
class Meta:
db_table="stu"
3) 激活模型app
编辑myweb/settings.py文件,并将该虚线路径添加到该INSTALLED_APPS设置。
INSTALLED_APPS = [
'django.contrib.admin' ,
'django.contrib.auth' ,
'django.contrib.contenttypes' ,
'django.contrib.sessions' ,
'django.contrib.messages' ,
'django.contrib.staticfiles' ,
'myapp.apps.MyappConfig', #或者直接写 myapp
]
通过命令将models的数据库生成到mysql中,数据库中便会有上述stu数据库表
python manage.py makemigrations
python manage.py migrate
4)启用网站admin管理 (了解)
1。数据迁移
python manage.py migrate
附录:makemigrations和migrate的作用
生成一个临时文件 python manage.py makemigrations
这时其实是在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,但是数据库没有增加新的表
接着执行migrate,这时候才真的把作用到数据库文件,产生对应的表
2。创建管理员用户
python manage.py createsuperuser
输入相关信息(结合自己)
3。启动服务,并通过浏览器访问admin localhost:端口/admin
输入刚创建的账号、密码,即可登录
4。设置时区和语言
在settings.py文件中,修改一下两个变量
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
5。将我们自定义的应用程序加入到后台管理
开myapp/admin.py 文件,并编辑代码如下:
from django.contrib import admin
from myapp.models import Stu
admin.site.register(Stu)
6。更深入设计后台管理
编辑myapp/models.py文件,在Stu类中添加如下信息,让后台管理显示中文字段
models.py
# 编辑myapp/models.py文件,在Stu类中添加如下信息,让后台管理显示中文字段。
class Stu(models.Model):
'''自定义Stu表对应的Model类'''
#定义属性:默认主键自增id字段可不写
id = models.AutoField("学号",primary_key=True)
name = models.CharField("姓名",max_length=16)
age = models.SmallIntegerField("年龄")
sex = models.CharField("性别",max_length=1)
classid=models.CharField("班级",max_length=8)
# 定义默认输出格式
def __str__(self):
return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid)
# 自定义对应的表名,默认表名:myapp_stu
class Meta:
db_table="stu"
verbose_name = '浏览学生信息'
verbose_name_plural = '学生信息管理'
编辑myapp/admin.py 文件,实现信息管理的个性化定制
admin.py
# 编辑myapp/admin.py 文件,实现信息管理的个性化定制
from django.contrib import admin
# Register your models here.
from myapp.models import Stu
#Stu模型的管理器(装饰器写法)
@admin.register(Stu)
class StuAdmin(admin.ModelAdmin):
#listdisplay设置要显示在列表中的字段(id字段是Django模型的默认主键)
list_display = ('id','name','age','sex','classid')
#设置哪些字段可以点击进入编辑界面
list_display_links = ('id','name')
#list_per_page设置每页显示多少条记录,默认是100条
list_per_page = 10
#ordering设置默认排序字段,负号表示降序排序
ordering = ('id',) #-id降序
#list_editable 设置默认可编辑字段
#list_editable = ['age','sex','classid']
#其他请详见手册文档说明
1)Django如何处理一个请求
1.settings.py文件中
ROOT_URLCONF = '项目名.urls'
2.urls.py文件中 urlpatterns
通过django.urls.path()和django.urls.re_path()
path(地址,程序)
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/',include('myapp.urls')),
]
3.按照顺序匹配每个path
4.views.py文件
5.如果匹配不到报404异常
说明:
捕获整数参数。如果不包括转换器/
,则匹配除字符以外的任何字符串。路径转换器
默认情况下,以下路径转换器可用:
str
匹配任何非空字符串,但路径分隔符除外'/'。如果表达式中不包含转换器,则为默认设置。int
匹配零或任何正整数。返回一个int。slug
匹配由ASCII字母或数字以及连字符和下划线字符组成的任何条形字符串。例如, building-your-1st-django-site。uuid
匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号并且字母必须小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。path
匹配任何非空字符串,包括路径分隔符 '/'。这样,您就可以匹配完整的URL路径,而不是像一样匹配URL路径的一部分str。通过浏览器访问服务
127.0.0.1:8000/abc ==> root url(根路由) ==> 加载子路由(myweb/urls.py)
==> 正则匹配访问的路径(path) =-=> 视图函数(views.index)
==> views.py index() 响应内容
示例
sid=0,name="" 当访问find/后面没有参数是 默认sid等于0,name为空
urlpatterns = [
path('find/',views.find),
path('find/',views.find),
path('find//',views.find),
]
def find(request,sid=0,name=""):
return HttpResponse("find....%d:%s"%(sid,name))
2)使用正则表达式
re_path(r'^fun/(?P[0-9]{4})/(?P[0-9]{2})$',views.fun),
def fun(request,yy,mm):
return HttpResponse("参数信息:%s年%s月"%(yy,mm))
3)关于404错误
1.在settings中
DIRS如下设置
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',
],
},
},
]
2.在myweb同级目录下创建templates文件夹,并创建404.html文件
404
404 not found
{{exception}}
3.将settings中,DEBUG设置为False
DEBUG = False
4.将settings中主机名设置为*
ALLOWED_HOSTS = ["*"]
4)包括其他的url路由
总路由文件,导入include
from django.urls import include
urlpatterns = [
path('myapp/',include('myapp.urls')),
]
在myapp中创建子路由urls.py
#myapp应用的路由
from django.urls import path,re_path
from . import views
urlpatterns = [
path('',views.index,name='index'),
path('add/',views.add),
path('find/',views.find),
path('find/',views.find),
path('find//',views.find),
re_path(r'^fun/(?P[0-9]{4})/(?P[0-9]{2})$',views.fun),
path('edit/',views.update),
]
5)url的反向解析
1 2根据应用路由中,name变量找到路由
打印出来的结果是 /myapp/add/
from django.urls import reverse
def index(request):
print(reverse('add')) #由reverse通过路由名称反向生成url请求地址
return HttpResponse('欢迎使用')
2 跳转页面
输入index视图的url后,跳转到add页面
def index(request):
return redirect(reverse('add')) #执行浏览器重定向
Model模型
模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。
通常,每个模型对应数据库中唯一的一张表。
模型与数据库的关系
模型(Model)负责业务对象和数据库的关系映射(ORM)
一个模型对应数据库中的一张表
一个属性对应一个字段
为什么要用模型?
Model是MVC框架中重要的一部分,主要负责程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据
它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库
开发流程
class Meta中可以设置数据库表名,如果不设置表明默认是 app名_类名(小写)
from django.db import models
from datetime import datetime
# Create your models here.
class Users(models.Model):
#id = models.AutoField(primary_key=True) #主键可省略不写
name = models.CharField(max_length=32)
age = models.IntegerField(default=20)
phone = models.CharField(max_length=16)
addtime=models.DateTimeField(default=datetime.now)
#class Meta:
# db_table = "myapp_users_1" # 指定表名
python manage.py makemigrations
如果出现下面错误
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No mo
dule named 'MySQLdb'.
Did you install mysqlclient or MySQL-python?
解决
pip install mysqlclient
若执行python manage.py makemigrations命令(也可能人比较皮,把migrations文件夹给删了),会提示"No changes detected." 可能有用的解决方式如下:
先 python manage.py makemigrations --empty yourappname 生成一个空的initial.py
再 python manage.py makemigrations 生成原先的model对应的migration file
python manage.py migrate
定义模型
模型实列
save
delete
模型查询
1.查询集
2.字段查询