Django注册登录

昨日内容回顾
纯手撸简易版的web框架

HTTP协议:
规定了客户端与服务端消息传输的格式

四大特性:
1.基于TCP/IP作用于应用层的协议
2.基于请求响应
3.无状态
4.无连接
请求消息格式
请求首行
请求头(一大堆kv键值对)
请求体(post请求携带的数据)
响应消息格式
响应首行
响应头(一大堆kv键值对)
响应体(你想访问的数据资源)
响应状态码
1XX 服务端已经接收到你的数据了正在处理,你可以继续提交数据
2XX 请求成功 返回相应资源
3XX 重定向
4XX 请求资源不存在
5XX 服务器内部错误

想根据用户访问的不同路径返回不同的页面
手动对http请求格式的数据进行切分等一系列处理获取到用户访问的路径
后端逻辑判断

借助于wsgiref帮助我们处理socket以及http数据

动态展示当前时间
后端获取当前时间利用字符串的替换替换html中特殊符号的部分

基于jinja2完成模板渲染

后端:user_dic = {'name':'jason','password':'123'}
		前端:
			{{ user_dic }}
			{{ user_dic.name }}
			{{ user_dic['name'] }}
			{{ user_dic.get('name') }}
			ps:jinja2模块提供了和python后端几乎一样的操作数据的方式
			
	后端:user_list = [{},{},{},{}]
	前端:
		{% for user_dict in user_list %}
			{{ user_dic }}
		{% endfor %}
		
	{{}} :跟变量相关
	{%%} :跟逻辑相关

动静态网页
	静态网页:数据是写死的,万年不变
	动态网页:数据是动态获取的 改数据可以是当前时间 数据库的数据

python三大主流web框架
django
flask
tornado

a:socket
b:路由与视图函数对于关系
c:模板渲染

django:a别人的  b.c自己写的
flask:b是自己的  a,c都是别人的

django
版本问题
推荐你使用1.11

确保django能够正常启动需要注意
1.计算机的名称不要有中文
2.项目名不要起中文
3.一个pycharm窗口就只放一个工程(项目)

安装

命令行
			pip3 install django==1.11.11
		测试是否安装成功
			django-admin
		创建django项目
			django-admin startproject 项目名称(不要用中文)
			项目名文件夹
				__init__.py
				settings.py  配置文件
				urls.py      路由与视图函数对应关系
				wsgi.py
			manage.py
		创建app
			python3 manage.py startapp 应用名
		
		应用名文件夹
			__init__.py
			admin.py 		django后台管理
			models.py		模型表
			views.py        视图函数(不一定就是函数也可以是类)
	启动django
		python3 manage.py runserver

	停止django项目
		ctrl+c
	ps:命令行创建不会自动创建templates文件夹
	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',
				],
			},
		},
	]
pycharm
	new project 选django 选本机解释器 勾选admin后台管理
	两种创建app的方式
		完整命令
		manage task	简便命令
	小绿色往右点击自动启动
	
	edit conf。。。。可以修改端口号
	
	
app的概念
	一所大学里面有很多学院,每个学院都有自己独特的功能
	
注意你新建的app需要在配置文件中注册
INSTALLED_APPS = [
			'django.contrib.admin',
			'django.contrib.auth',
			'django.contrib.contenttypes',
			'django.contrib.sessions',
			'django.contrib.messages',
			'django.contrib.staticfiles',
			'app01.apps.App01Config'
		]
ps:pycharm能自动帮你创建一个app并自动注册到配置文件中

django小白必会三板斧
HttpResponse:返回字符串
render:返回html并且支持模板渲染
redirect:重定向
既可以重定向到别人的网址也可以定向到自己的

今日内容
手把手带你写登录功能
pycharm连接数据库
orm简单操作
图书管理系统表分析

登录功能
1.路由访问如果不加斜杠 会内部自动重定向加斜杠的路由

所有的html文件默认都写在templates文件夹下

所有的静态文件(css,js,前端第三方类库)默认都放在static文件夹下

html页面引入外部资源的方式
cdn
本地

静态文件配置
STATIC_URL = ‘/static/’

静态文件配置

STATICFILES_DIRS = [
os.path.join(BASE_DIR,‘static’)
]

暴露给外界能够访问服务器静态文件夹下面所有的资源

STATIC_URL = ‘/xxx/’ # 接口前缀 跟你的静态文件夹的名字一点关系都没有

默认情况下这个前缀跟静态文件夹名字一样!!!

静态文件配置

STATICFILES_DIRS = [
os.path.join(BASE_DIR,‘static’), # 就是你的静态文件夹路径
os.path.join(BASE_DIR,‘static1’),
os.path.join(BASE_DIR,‘static2’)
]

ps:会依次查找列表中所有的静态文件路径 找到的话立刻停止,都没有找到返回404

form表单触发提交数据的动作两种方式

form提交数据的地址如何指定及方式?
action属性控制提交的地址
方式:
1.全路径

2.只写路径后缀

3.不写 (默认往当前路径提交)
form表单默认是get请求

根据客户端请求方式的不同执行不同的逻辑代码
def login(request):
	# 获取用户端提交的请求方式
	print(request.method)  # 拿到的请求方式是全大写的字符串
	if request.method == 'GET':
		return render(request,'login.html')
	elif request.method == 'POST':
		return HttpResponse("收到了 老弟")

个人建议按照下面这种方式书写 减少代码冗余及结构混乱的问题
def login(request):
	if request.method == 'POST':
		return HttpResponse('OK')
	return render(request,'login.html')


def login(request):
# 获取用户端提交的请求方式
print(request.method)  # 拿到的请求方式是全大写的字符串
# if request.method == 'GET':
#     return render(request,'login.html')
# elif request.method == 'POST':
#     return HttpResponse("收到了 老弟")
if request.method == 'POST':
    print(request.POST)  # 你就把它当成一个大字典里面存放了客户端post提交的所有的数据
    # request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} >
    print(request.POST.get('username'))  # value虽然是个列表但是获取value的时候拿到却是单个元素
    # 默认只会取value列表里面的最后一个元素
	# request.POST:<QueryDict: {'username': ['jason', 'egon'], 'password': ['123']}>
    print(request.POST.getlist('username'))  # 要想一次性获取value列表里面所有的数据需要用getlist()
    # ['jason', 'egon']
	print(request.POST['password'])  # 不推荐使用该方法获取数据
    return HttpResponse('OK')
return render(request,'login.html')

获取value列表里面所有的元素需要使用getlist  应用场景:用户的爱好 多选框
get只会获取到value列表的最后一个元素



print(request.GET)  # <QueryDict: {'username': ['jason'], 'password': ['123']}>
request.GET.get('user')  
# <QueryDict: {'username': ['jason','egon'], 'password': ['123']}>
request.GET.getlist('username')



django连接数据库
1.需要修改配置文件
	DATABASES = {
		'default': {
			'ENGINE': 'django.db.backends.mysql',
			'NAME': 'day54',
			'HOST':'127.0.0.1',
			'PORT':3306,
			'USER':'root',
			'PASSWORD':'123'
		}
	}
	ps:键必须都是大写

2.告诉django用pymysql替换它默认mysqldb模块连接数据库
	方式1:在你的项目文件夹下面的__init__.py
	方式2:也可以在你的应用文件夹下面的__init__.py
	
	# 固定写法
	import pymysql
	pymysql.install_as_MySQLdb()  # 告诉django用pymysql代替mysqldb连接数据库

什么是ORM?
对象关系映射
类 》》》 表
对象 》》》 表记录
对象的属性 》》》 一条记录某个字段对应的值

django的orm不能够自动帮你创建库,但是可以自动帮你创建表

提示:一个django项目就使用一个库,不要多个django项目使用一个库

数据库迁移(同步)命令(******)
python3 manage.py makemigrations 将你的数据库变动记录到一个小本本上(并不会帮你创建表)
python3 manage.py migrate 将你的数据库变动正在同步到数据库中

新增数据

操作数据库user表插入数据

方式1:

user_obj = models.User.objects.create(name=username,password=password)

方式2:

user_obj = models.User(name=username,password=password)
user_obj.save() # 对象调用save方法保存到数据库

查询数据

user_list = models.User.objects.all() # 获取user表所有的数据

只要是QuerySet就可以点query查看获取到当前QuerySet对象的内部sql语句

print(user_list.query)

利用a标签href属性 可以指定页面跳转的路径 href可以写全路径 但是推荐写后缀即可
添加数据

注意 路径的书写一定要加斜杠

重定向 可以写别人的网址也可以是自己的路径
return redirect(’/userlist’)
return redirect(’/userlist/’)

queryset对象支持索引取值 但是不推荐你使用 推荐使用自带的.first()帮你获取第一条数据

删除
models.User.objects.filter(id=1).delete() # 会将queryset所有的数据对象全部删除

查询数据需要注意的是你获取到的到底是一个queryset还是一个数据对象
user_query = models.User.objects.filter(id=edit_id).first() # 如果你是要获取数据对象first千万别忘了

filter当条件不存在的情况下会返回一个空的queryset对象

<QuerySet []> <class ‘django.db.models.query.QuerySet’>

user_obj = models.User.objects.get(id=edit_id) # 用get可以直接获取到数据对象本身但是查询条件不存在的情况下直接报错

编辑
编辑对象的id的获取方式
方式1:利用input隐藏一个标签

方式2:

注意:queryset对象点修改 删除 会作用于对象内部所有的数据对象 类似于批量操作
方式1:
models.User.objects.filter(id=edit_id).update(name=username,password=password)
方式2:获取到当前数据对象
user_obj = models.User.objects.filter(id=edit_id).first()
user_obj.name = username
user_obj.save()

修改模型层里面的跟表相关的所有的数据,只要你修改了就必须重新执行数据库迁移命令
python manage.py makemigrations 记录到小本本上
python manage.py migrate 真正操作数据库

django请求生命周期

图书管理系统表设计
书籍表

作者

出版社

外键字段名 orm会自动在字段名后面加_id.无论你的字段名有没有_id

端午作业
先整理今天的笔记与博客
用户的增删该查
尽最大努力完成图书管理系统
起码给我展示图书 作者 出版社信息

ps:视图函数必须返回一个HttpResponse对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值