Django框架基本知识
5.25
上周内容回顾
纯手写web框架
- socket代码需要自己写
- http格式的数据要自己处理,只能拿到用户输入的路由
基于wsgiref模块:web服务网关接口
- 帮助你封装了socket代码
- 帮你处理了http格式的数据,得到一个大字典(env)
- 监听一个地址,请求来的时候帮你拆分http格式封装成方便处理的数据格式
- 响应走的时候再帮你把数据打包成符合http格式的数据
根据功能的不同,拆分成不同的py文件
- urls.py:路由与视图函数对应关系
- views.py:业务逻辑的视图函数,也可以是类
- templates模板文件夹:存储html文件
动静态网页
-
根据html页面是写死的还是从后端动态获取的区分
-
如何将后端的数据传递给html
-
jinja2模板语法
{{user_list}} {%for i in user_list%}
jinja2的模板语法比较贴近python语法,有时候比python更加简单
-
python三大主流web框架
- django:大而全,有时候过于笨重
- flask:小而精,第三方组件很多
- tornado:异步非阻塞
注意事项
- 计算机名称不能有中文
- 一个pycharm窗口不要打开多个项目,不要出现文件夹套文件夹
- 文件名也不要出现中文
- python解释器版本建议3.6,django建议1.11版本
django必会命令
1. 创建django项目
先切换到一个盘中 D:
django-admin startproject mysite
2. 启动django项目
python3 manage.py runserver 127.0.0.1:8080
3. 创建应用
python3 manage.py startapp app01
一个django项目就是一个空壳,本身没有任何内容,应用类似于一个个的功能模块
创建应用之后一定要去配置文件settings中注册才会生效
INSTALLED_APP = {
'app01'
'appo1.apps.App01Config'
}
命令行创建应用,不会自动创建templates文件夹,也不会自动配置路径
DIR:[os.path.join(BASE_DIR,'templates')]
pycharm会自动创建并自动配置路径,会自动主次一个应用
django主要文件介绍
mysite
- mysite
- urls.py
- settings.py
...
- manage.py
- app01.py
- tests.py
- modles.py
- views.py
django小白3必会
form django.shortcuts import HttpResponse,render,redirect
return HttpResponse('字符串')
return render(request,'login.html')
return redirect(url)
html获取视图函数发来的值
# 视图函数中
return render(request,'index.html',data)
# 指名道姓传data
return render(request,'index.html',locals())
# 传回局部名称空间中所有的数据
今日内容
以登陆功能为例
- 静态文件配置
- request对象方法初始
- pycharm连接数据库MySql
- django连接数据库
- django ORM简介
- 利用ORM实现数据的增删改查操作
先大致掌握django的功能,后面再详解
静态文件配置
登陆功能
-
创建应用
-
注册url
-
在视图函数里添加login函数
-
创建login的html文件,放在templates文件夹下
将网站使用的静态文件默认放在static文件夹下
静态文件:前端写好的,直接调用展示的都是静态文件,如css,js文件,需要用到的图片文件以及框架 django不会给你船舰static文件夹,需要自动创建 static文件夹下再创建几个文件夹:js,css,img,bootstrap 在浏览器中输入url能够看到对应的资源,是因为后端提前开了该资源的接口,所以对静态文件,应该提前开放访问的接口
静态文件配置方法
settings-->STATIC_URL
STATIC_URL = '/static/' # 类似访问的令牌,一旦发现连接是以static开头,就允许连接到static列表里面找文件
# link href="/static/css/..."
# 令牌可以换别的
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
# 再在网页中引用静态文件,使用/static/开头
当你在写django项目的时候,可能会出现后端代码修改了但是前端页面没有变化的情况
- 在同一个端口开了好几个django项目,在跑的其实是第一个django项目
- 浏览器缓存问题,setting,network,disable cache勾选上
动态解析static令牌
{% load static}
<link href="{% static 'bootstrap-3.3.7......'}">
登陆页面
- 先写一个form表单,input用户名,password,class=form-control
- input,type=submit
- form表单默认是get,改method为post,改action为login后缀
- 前期提交的时候遇到403,就去注释掉中间键MIDDLEWARE
判断当前请求方式
request.method # 得到请求方式
# GET或POST,可以在视图函数中进行判断,人为的区分
if request.method =='GET':
return 'GET'
# 获取用户提交的数据,一个字典
print(request.POST)
username = request.POST.get('username')
# 拿到username列表的最后一个元素:字符串格式
request.POST.getlist('username')
# 获取整个列表,list类型
return 'POST'
request对象方法初始
request.method
# 获取当前请求的类型,得到字符串GET或POST
request.POST
# 获取用户提交的post请求数据,得到一个字典
request.GET
# 获取用户提交的GET请求数据,得到一个字典
request.POST.get('username')
# 拿到username列表的最后一个元素:字符串格式
request.POST.getlist('username')
# 获取整个列表,list类型
request.GET.getlist('username')
# 获取整个列表,list类型,用法跟post一模一样
get获取的数据大小有限制,post没有限制
pycharm连接数据库
右侧,database,+,data source,mysql
一定要先安装对应的驱动:download missing driver
在当前项目文件夹下先创建一个库,再连接
django连接MySQL
settings中自带一个小数据库sqllite3
# settings.py
DATABASE = {
'deafult':{
'ENGINE':'django.db.backends.mysql',
'NAME':'db1' # 库名
'USER': 'root',
'PASSWORD':'6008',
'HOST': '127.0.0.1',
'PORT': '3306',
'CHARSET':'utf8'
}
}
# 完成配置settings之后,django默认用mysqldb模块连接,但是该模块兼容性不好,需要手动改为pymysql连接
# 需要告诉django不要用默认的MySQLdb,而是用pymysql
# 在项目名下的init内打个补丁
import pymysql
pymysql.install_as_MySQLdb()
Django ORM
orm:对象关系映射,能够让一个不懂sql语句的人也可以通过python面向对象的代码简单快捷的操作数据库
不足:封装程度太高,有时候效率低
models.py
先在models.py中写一个类
from django.db import models
class User(models.Model):
# id int primary_key auto_increment
id = models.AutoField(primary_key=True)
# username varchar(32)
username = models.CharField(max_length = 32)
# password int
password = models.IntegerField()
# 相当于创建了三个字段
class Author(models.Model):
# 由于一张表中必须要偶一个主键,并且一般情况都叫id,所以orm当你不定义主键字段的时候,orm会自动创建一个名为id的主字段
username = models.CharField(max_length = 32)
# charfield必须指定max_length参数,不指定会报错
# 还可以指定verbose_name,对字段进行注释
password = models.IntegerField()
数据库迁移命令
只要修改了数据库,就要执行以下代码
python3 manage.py makemigrations
将操作记录到migration文件夹
python3 manage.py migrate
将操作真正同部到数据库中
利用orm实现字段增删改查
# 字段的增加,三种方法
1.可以在终端内直接给出默认值
2.该字段可以为空
info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
3.直接给字段设置默认值
hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
# 字段修改
修改代码,再执行数据库迁移的两条命令即可
# 字段删除
把对应的字段注释,再执行两条命令
不要轻易删除操作
数据的增删该查
查询:filter
获取用户名的密码,利用orm操作数据,校验数据是否正确
from app01 import models
res = models.User.objects.filter(username=username)
print(res) # 一个列表,套着数据对象
# 类似于selec * from user where username = username
# filter括号内可以携带多个参数,参数与参数之间默认是and关系
user_obj = res[0] # 拿到user对象
# 也可以使用res.first() 拿到第一个
user_obj.username
user_obj.password # 拿到数据
# 进行逻辑判断
增加
# 第一种
from app01 import models
res = models.User.objects.create(username=username,password=password)
# 第二种,利用对象.属性,对象.save()
user_obj = models.User(username=username,password=password)
user_obj.save() # 保存数据