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的功能,后面再详解

静态文件配置

登陆功能

  1. 创建应用

  2. 注册url

  3. 在视图函数里添加login函数

  4. 创建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项目的时候,可能会出现后端代码修改了但是前端页面没有变化的情况

  1. 在同一个端口开了好几个django项目,在跑的其实是第一个django项目
  2. 浏览器缓存问题,setting,network,disable cache勾选上

动态解析static令牌

{% load static}
<link href="{% static 'bootstrap-3.3.7......'}">

登陆页面

  1. 先写一个form表单,input用户名,password,class=form-control
  2. input,type=submit
  3. form表单默认是get,改method为post,改action为login后缀
  4. 前期提交的时候遇到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()  # 保存数据
posted @ 2020-05-25 16:49  黑猫警长紧张  阅读(203)  评论(0编辑  收藏  举报