一、页面运行
1.当在网页运行时报错
200-300:代表成功
300-400:位置发生改变
400-500:资源部可用,比如资源地址写的不对,或者资源地址写得对但权限不够
500:服务器页面报错
2.HTTP请求中POST与GET的区别
一般我们在浏览器输入一个网址访问网站都是GET请求;在FROM表单中,可以通过设置method指定提交方式为GET或者POST提交方式,默认为GET提交方式
HTTP定义了与服务器交互的不同方法,其中最基本的四种:GET POST PUT DELETE HEAD,其中GET和HEAD 被称为安全方法,因为使用GET和HEAD的HTTP请求不会产生什么动作.不会产生动作意味着GET和HEAD的HTTP请求不会在服务器上产生任何结果.但是安全方法并不是什么动作不产生,这里的安全方法是紧紧不会修改信息
根据HTTP规范,POST可能修改服务器上的资源的请求.比如CSDN的博客,用户提交一篇文章或者一个读者提交评论是通过POST请求来实现的,因为在提交文章或者评论提交后资源(某个页面)不同了,或者说资源被修改了,这些便是"不安全方法"
二、通过Django创建页面逻辑
1.创建项目得到文件目录
2.创建新的模板>>文件夹>>页面
3.wsgi.py 将http请求转变为运行代码
4.代码解析 进入uls.py 配置目录 按照先后顺序匹配urlpatterns每个元素(此处通过path()处理字符串路由),字符串匹配成功后,停止查找,根据结果执行对应的处理函数(匹配不成功出现异常)
5.通过views.py中填写的函数处理请求注册的命令,再通过templates下的页面代码展现静态页面
6.models.py 创建一个对象(类 )
7. 此Django与数据库MySQL的连接.我们需要 更改django的数据库连接引擎 django连接数据库必须要有django driver 为mysqlclient 版本为1.7.3+
在DOS可以通过 pip install mysqlclient来安装
然后在settings.py中更改
8. 通过 manage.py总项目配置 执行三条命令(在Mysql中提前创建py_blog库)
<1>makemigrations 项目名(apps.py里的name) :完成models.py所要创建的模板
<2>sqlmigrate 项目名 0001 :提示将要执行的的sql语句
<3>migrate 项目名 0001 :执行sql命令
9.检查settings.py下TEMPLATES里面的DIRS有没有填写如果没有就补写
三、注册页面
1.创建项目exercise
在模板中创建一个python包 再创建两个html页面
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form>
<p>
用户名:<input type="text">
</p>
<p>
密码:<input type="password">
</p>
<p>
<input type="submit" value="注册">
</p>
</form>
</body>
</html>
welcome.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册成功,欢迎访问本页面</h1>
</body>
</html>
2.settings.py更改设置
注:提前在数据库中创建py.blog库
3.models.py中创建数据的对象 生成数据库表(模型类必须继承models.Model类或子类)
from django.db import models
# Create your models here.
class BlogUser(models.Model):
userName=models.CharField(max_length=20)
passWord=models.CharField(max_length=20)
4.执行manage.py的shell命令 用快捷键Ctrl+Alt+R进入
<1>
目录中出现
<2>
<3>
查看数据库
5.在exercise模块下的urls.py中的urlpatterns下添加匹配元素
include的目的作为命令空间项目基本exercise下的urls.py和blog_user下的urls.py联系起来
命名空间 django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都有一条路有映射,这样才能将请求交给对一个的view中的函数去处理,其他大部分的Web框架则是对一类的url请求做一条路有映射,从而使路由系统变得简洁
路由是关联url及其处理函数关系的过程.Django的url路由都写在urls.py文件中的urlpatterns列表中
补充说明:
urlpatterns中的path()处理字符串函数 re_path处理正则表达式路由
语法:
urlpatterns=[
path(route,views.函数名,向处理函数提供的额外参数,以字典形式表示,该URL模式的别名)
re_path(正则表达式,view.对应的处理函数)]
其中正则表达式可以看做字符串的模式
Django支持三种表达route:
<1>精确字符串格式:user/2017/ 一个精确URL匹配一个操作函数;最简单的形式,适合对静态URL的响应;URL字符串不以'/'开头,但要以'/'结尾
<2>Django的转换格式<类型:变量名> 格式如:articles/<int:id>/ 是一个URL模板,匹配URL同时在其中获得一批变量作为参数;是一种常用形式,目的是通过URL进行参数获取和传递
转换格式类型 | 说明 |
Str | 匹配除分隔符(/)外的非空字符,默认类型<year>等价于<str year> |
Int | 匹配0和正整数 |
Slug | 匹配字母 数字 横杠 下划线组成的字符串,str的子集 |
Uuid | 匹配格式化的UUID |
path | 匹配任何非空字符串,包括路径分隔符,是全集 |
<3>正则表达式: articles/?p<year>[0-9]{4}/ 借助正则表达式丰富语法表达一类URL(而不是一个);可以通过<>提取变量作为处理函数的参数,高级语法
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('user/',include('blog_user.urls',namespace='user'))
]
6.在blog_user模块中创建python文件urls.py并添加匹配代码
#usr/bin/python
#-*-coding:utf-8-*-
from django.urls import path
from blog_user import views
app_name='user'
urlpatterns = [
path('register',views.register)]
7.在views.py中添加函数
from django.shortcuts import render
# Create your views here.
def register(request):#用来处理http请求
return render(request,'user/register.html',{})
运行项目
点击进入浏览器
四、为简单的注册页面添加条件
1.将注册页面的提交请求设置为POST请求
action=" " 制定了表单提交的地址,也就是提交到那个页面 引号填写的是处理页面的地址,相对路径.或者http绝对路径
jango对POST请求需要csrf_token验证,后端会检测前端发过来的token,如果有问题可以会出现403Forbidden的错误。这个token是由后端在页面GET请求页面文件的时候就放进去的,可以在模板中使用{%csrf_token%}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="/user/register">#"/"代表根目录必须加上
{% csrf_token %}
<p>
用户名:<input type="text">
</p>
<p>
密码:<input type="password">
</p>
<p>
<input type="submit" value="注册">
</p>
</form>
</body>
</html>
2.对注册内容进行保存,提交后跳转页面并出现注册的内容
在views.py文件的展示weicome页面的代码行中加入{'key':value}
views.py
from django.shortcuts import render
# Create your views here.
from blog_user.models import BlogUser
def register(request):#用来处理请求注册的命令
#做一个区分 get post 请求类别
# 如果得到请求命令为GET类型,进入注册页面
if request.method=='GET':
return render(request,'user/register.html',{})
#如果请求命令为POST,进入欢迎页面
elif request.method=='POST':
#数据库数据的保存操作
#创建一个用户/数据库 表对象模型
bloguser=BlogUser()#导入models.py下的BlogUser对象
#根据表单中的用户名name 密码name 来获取
#并加入数据库中的userName和passWord列中
bloguser.userName=request.POST.get('username')
bloguser.passWord=request.POST.get('upw')
#数据保存
bloguser.save()
#给页面插出入数据 形式为'key':value
return render(request, 'user/welcome.html', {'blog':bloguser})
welcome.html
在html文本中加入Djanggo数据内容(脚本) 语法:{{'key',userName}}(userName 是 对象即value下的姓名列)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册成功,欢迎{{ blog.userName }}访问本页面</h1>
</body>
</html>
执行命令 进入浏览器可以看到
跳转后
数据库数据
3.解决用户名重复的问题,
在Web开发中页面响应方式分为两种
<1>转发:一次请求和响应,请求的地址没有发生变化,如果此时刷新页面,就会出现重做现象
在服务器内部共享同一次请求资源并把内部资源隐式响应给客户端
<2>重定向:一次以上的请求和响应,请求地址发生一次以上的变化时,如果此时刷新页面就不会出现重做现象.同一次请求不共享
如果不做重定向的话,我们在提交用户名和密码的时候,这时候点刷新,用户名和密码就会一直提交,如果数据库没有做限制的话,那么就会出现多个相同的用户名和密码
要解决这个问题,首先我们需要在views.py里面导入redirect和reverse模块,然后需要在我们刷新的时候跳转到另一个页面,我们在里面创建一个welcome()通过用户的id来显示在页面上
from django.shortcuts import render,reverse,redirect
# Create your views here.
from blog_user.models import BlogUser
def register(request):
if request.method=='GET':
#转发
return render(request,'user/register.html',{})
elif request.method=='POST':
bloguser=BlogUser()
bloguser.userName=request.POST.get('username')
bloguser.passWord=request.POST.get('upw')
#数据保存
bloguser.save()
#重定向
return redirect(reverse('user:welcome',args=[bloguser.id]))
#用来处理welcome 请求
def welcome(request,id):
#根据请求带参的那个id获取数据库信息
bloguser=BlogUser.objects.get(pk=id)
return render(request, 'user/welcome.html', {'blog': bloguser})
然后修改blog_user 下的urls.py
#usr/bin/python
#-*-coding:utf-8-*-
from django.urls import path
from blog_user import views
app_name='user'
urlpatterns = [
path('register',views.register),
path('welcome/<int:id>/',views.welcome,name='welcome')]
我们要修改models.py的内容(数据冗余:1.数据库约束 唯一约束 2.通过代码)
models.py
from django.db import models
# Create your models here.
class BlogUser(models.Model):
userName=models.CharField(max_length=20,unique=True)
passWord=models.CharField(max_length=20)
但这是我们的数据库并没有发生变化,因为我们数据库已经有重复的用户名了,已经违背了原则,所以我们可以将数据库生成连个表全都删去然后重新创建表用快捷键CTRL+ALET+R
分别执行代码:makemigrations blog_user
因为我们已经有了0001这个表,所以这次生成的是0002
sqlmigrate blog_user 0002
migrate blog_user 0002
执行代码进入页面后注册同样的名字将会报错
解决报错并返回注册页面提示用户名已存在
在views.py中通过try:....except:...处理报错
from django.shortcuts import render,reverse,redirect
# Create your views here.
from blog_user.models import BlogUser
def register(request):
if request.method=='GET':
#转发
return render(request,'user/register.html',{})
elif request.method=='POST':
bloguser=BlogUser()
bloguser.userName=request.POST.get('username')
bloguser.passWord=request.POST.get('upw')
try:
bloguser.save()#在数据保存时判断是否报错
return redirect(reverse('user:welcome',args=[bloguser.id]))
except:
return render(request, 'user/register.html', {'blog': bloguser,'error':'用户名重复'})
#用来处理welcome 请求
def welcome(request,id):
#根据请求带参的那个id获取数据库信息
bloguser=BlogUser.objects.get(pk=id)
return render(request, 'user/welcome.html', {'blog': bloguser})
welcome.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="/user/register">
{% csrf_token %}
<p>
{{ error }}
</p>
<p>
用户名:<input value="{{blog.userName}}" type="text" name="username">
</p>
<p>
密码:<input type="password" name="upw">
</p>
<p>
<input type="submit" value="注册">
</p>
</form>
</body>
</html>
进入浏览器接着输入张三后出现