day52 django流程 登录

app

新创建的app一定要先去settings.py注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 'app01' # 简写
'app01.apps.App01Config' # 全称
]
django其实就是一个专门用来开发app的web框架
一个空的django的项目就类似于是一所大学
app就类似于大学里面的各个学院
比如你的选课系统(学生,老师,管理员)
在比如你的优酷项目(普通用户,vip用户,管理员)
大白话:针对不同的功能模块 你就可以开设不同的app去处理实现程序的解耦
并且更好的实现分组开发

静态文件配置

大前提:浏览器之所以能够输入网址访问到对应的资源,是因为后端开设了资源的访问接口(url),
django在何处可以开设接口??? urls.py路由与视图函数对应关系

网址所用到的html文件通常都是放在templates文件夹下
网站所用到的静态资源通常都是放在static文件夹下

django 配置文件中指定静态文件暴露的接口


html文件默认全都放在templates文件夹下
对于前段已经写好了的文件 我们只是拿过来使用 那么这些文件都可以称之为叫"静态文件"
静态文件可以是
  bootstrap一类的前段框架 已经写好了的
  图片
  css
  js
静态文件默认全都放在static文件夹下
static文件夹中默认会默认创建的子文件夹
css文件夹 当前网站所有的样式文件
js文件 当前网站所有的js文件
img文件 当前网站所有的图片文件
其他(前端框架代码 第三方插件代码...)


启动ddjango项目的时候 一定要确保一个端口号只有一个django项目在占用
不然的话 会容易造成bug


用户可以访问的资源 都在url中
只有url中开设相关的资源你才能访问到(******)

后端资源一般都需要手动指定是否需要暴露给用户

静态文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
你只要输入static文件夹内具体文件的路径就能够访问到



STATIC_URL = '/static/' # 这个static不是文件夹的名字 而是接口前缀
"""只要你想访问静态文件中的资源 文件路径就必须用static开头"""
# 手动将static文件夹中所有的资源暴露给用户
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 真正的文件夹路径
os.path.join(BASE_DIR,'static1'), # 真正的文件夹路径
os.path.join(BASE_DIR,'static2'), # 真正的文件夹路径
os.path.join(BASE_DIR,'static3') # 真正的文件夹路径
]


django默认是支持自动重启代码的 所以你只需要多刷新几次页面就可以
但是有时候它的重启机制比较慢
机制:实时监测文件代码变化 只要有变化 就会自动重启
可能你的代码还没有写完 这个时候就会自动报错


静态文件接口前缀"动态解析"
{% load static %}
      {% static '文件路径' %} 

<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
利用解析器 动态获取接口前缀



form表单默认是get请求
携带数据的方式是url问好后跟数据
http://127.0.0.1:8000/login/?username=zekai&password=123

可以通过method改为post请求
改成post请求之后 需要去settings文件中注释掉一个中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

form表单提交数据目的地由action
1.不写的情况下 默认往当前地址提交
2.还可以写后缀/index/(将项目常用这种)
3.还可以写全路径

视图函数一般主要会先处理get请求
def login(request):
# 视图函数针对不同的请求方式 应该有不同的处理逻辑
# if request.method == 'GET':
# print('收到了')
# print(request.method) # 能够获取前端请求方式 并且是全大写的字符串
# print(type(request.method))
# return render(request,'login.html')
# elif request.method == 'POST':
# # 获取用户输入 做相应的逻辑判断
# return HttpResponse("拿到了 老弟")
if request.method == 'POST':
return HttpResponse('来啦 宝贝')
return render(request,'login.html')


获取前端数据
request.method获取请求方法

对数据的处理 不单单只有wsgiref模块 django后端也进行了大量的数据处理
GET
request.GET获取前端get提交的数据(就类似于是一个大字典)
取值
request.GET.get('username') # 虽然value是一个列表 但是默认只取列表最后一个元素
# 强烈不建议你使用中括号的形式取值

# 如果想直接把列表全部取出(******)
request.GET.getlist('hobby')
POST
request.POST获取前端post提交的数据(就类似于是一个大字典)
取值
request.POST.get('username') # 虽然value是一个列表 但是默认只取列表最后一个元素
# 强烈不建议你使用中括号的形式取值

# 如果想直接把列表全部取出(******)
request.POST.getlist('hobby')
get请求和post请求携带参数的特点
get请求是直接在url后面?开头以&连接多个条件
/index/?id=1&username=jason(get请求携带的参数大小是有限制的)

而post请求数据是放在请求体中的
 

pycharm连接数据库

侧边栏database连接你想要操作的数据库

django连接MySQL

      django默认使用的是自带的sqlite数据库,该数据库对日期不是很精确      如果你想让它其他的数据库  需要在settings配置文件中 配置
      1.settings文件中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day51',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'123',
'CHARSET':'utf8'
}
}
2.还要在项目名下的init文件或者是应用名下的init文件中告诉django不要使用默认的mysqldb连接mysql
而是使用pymysql
import pymysql
pymysql.install_as_MySQLdb()

django orm
ORM对象关系映射
表 类
一条条记录 对象
字段对应的值 对象的属性

django orm不会帮你创建库,需要你自己手动创建库,它只能帮你创建表(建议你一个django就新建一个数据库)
   首先需要在应用下的models.py中书写模型类
class User(models.Model):
# 将id字段设置为User表主键字段 在django orm中 你可以不写主键字典 django会默认给你的表创建一个名为id的主键字段
# id = models.AutoField(primary_key=True) # 一旦你自己指定了主键字段 那么django就不会自动再帮你创建了
username = models.CharField(max_length=32) # username varchar(32) CharField必须要指定max_length参数
password = models.IntegerField() # password int
*************************需要执行数据库迁移(同步)命令******************************
python3 manage.py makemigrations # 仅仅是在小本本上(migrations文件夹)记录数据库的修改 并不会直接操作数据
python3 manage.py migrate # 将数据库修改记录 真正同步到数据库
注意:只要动了models中跟数据库相关的代码 就必须重新执行上面的两条命令 缺一不可(******)



表字段的增删改查

当一张表已经创建出来之后 后续还想添加字段,可以有两种方式
1.给新增的字段设置默认值
addr = models.CharField(max_length=32,default='China') # default该字段默认值

2.给新增的字段设置成可以为空
age = models.IntegerField(null=True) # 该字段允许为空


删(慎用)
删除字段 直接在models.py中注释该字段 然后重新执行两条命令即可
注意:执行完之后 表中该字段所对应的所有的数据全部删除
并且一般情况下 基本是不会用到真正意义上的删除




orm操作需要使用models中的类的名字

数据的查
from app01 import models

models.User.objects.all() # 直接拿所有的数据

models.User.objects.get(username=username)

res = models.User.objects.filter(username=username)
res.query

user_obj = res.first()

数据的增
1.
models.User.objects.create(username=username,password=password)
2.
user_obj = models.User(username=username,password=password)
user_obj.save()


models.User.objects.filter(条件).delete()


models.User.objects.filter(条件).update()







用户的增删改查
1.通过orm展示所有的到前端
all()
模板语法for循环
2.添加新增按钮 (用户的新增操作)
a标签的href直接触发后端逻辑
create()
3.添加编辑 删除按钮
编辑
删除
利用get请求携带参数的特点 在url的后面跟上对应数据的id值
request.GET.get()

如果是编辑
重新渲染一个页面 将编辑对象传递到前端

如果是删除
直接利用filter(...).delete()

表字段的增删改查
1.当表已经创建出来之后 需要新增字段 该字段需要设置默认值 或者 设置成可以为空
default='默认值'
null = True
2.当你注释了某个字段 再执行数据库迁移命令之后 数据库表中 该字段对应的数据全部删除了 (慎用)
表记录的增删改查
操作django orm都是以模型类名作为开头
from app01 import models
以用户的增删改查为例

1.先连接数据库展示所有用户信息
1.获取模型表中所有的数据
models.User.objects.all() # 结果也是querySet对象 只要是queryset对象 就可以点query查看内部sql语句
2.筛选相应的数据
1.直接获取对象的
models.User.objects.get(**kwargs) # 条件不存在 立刻报错 不推荐使用
2.获取querySet对象的(
1.querySet对象你可以把它看成是一个列表 里面放的是一个个的数据对象
2.querySet对象支持索引取值和切片操作 但是不支持负数 也不推荐你使用
建议你使用封装好的方法
)
queryset = models.User.objects.filter(**kwargs) # 括号内多个参数是and的关系
user_obj = querySet.first() # 没有也不会报错 直接返回None
2.新增用户
1.利用create()方法
该方法会将当前创建的数据对象返回出来
current_user_obj = models.User.objects.create(**{...})
2.利用对象的绑定方法
user_obj = models.User(**kwargs)
user_obj.save()

3.修改用户
1.利用queryset对象的update批量修改的方法
models.User.objects.filter(age = 18).update(**kwargs) # 会将queryset中所有的数据全部修改

2.利用对象修改属性的方法
user_obj = models.User.objects.filter(**kwargs).first()
user_obj.username = 'jason'
user_obj.save() # 该方法 会将数据库中所有的字段全部重写修改一遍 效率极低 不推荐使用

4.删除用户(不会真正删除数据 通常都是给数据加一个表示是否删除的字段)
1.利用queryset对象delete批量删除
models.User.objects.filter(age = 18).delete() # 会将queryset中所有的数据全部删除
 

猜你喜欢

转载自www.cnblogs.com/komorebi/p/11551089.html