浏览器 urls:http://jd.com/caidian/
urls.py:
1、 http://127.0.0.1:8000/timer GET 无请求数据
2、 url:url(r'^timer/', views.showtime),
3、 views.py: showtime(request)
4、响应 时间字符串
一次请求响应结束后断开连接
request是所有请求信息的对象
1、http://127.0.0.1:8000/login/ GET 无请求数据
2、url(r'^login/', views.login),
3、views.py: login(request)
4、响应 :login.html
1、http://127.0.0.1:8000/valide/ POST {"user":"yuan","pwd":"123"}
2、url(r'^valide/', views.valide),
3、views:valide(request)
4、if 成功: 响应字符串,验证成功
注:<form>表单中action="/validate/"也可以
Terminal: python manage.py runserver 127.0.0.1 8090
详见Django项目MTV 应用app01
Terminal: python manage.py startapp blog
urls: ^blog/article/d+/,article ^blog/article/d+/$,article
views: def article(request)
urls: ^blog/article/(d+)/,article
views: def article(request,id) 将d+数字作为参数传过来
正则表达式中分组的概念
无名分组:
urls: ^blog/article/(d+)/(d+)/,article
views: def article(request,year,month) 将d+数字作为参数传过来
return HttpResponse("OK"+year+month)
有名分组,关键字传参:
urls: ^blog/article/(?p<year_id>d+)/(?p<year_id>d+)/,article
views: def article(request,year_id,month_id) 将d+数字作为参数传过来
return HttpResponse("OK"+year_id+month_id)
url有先来后到顺序,先匹配到的会覆盖后匹配到的。
解耦;总的urls做分发应用:
路由分发app:import include
urls:^blog/,include('blog.urls')
models新建urls.py:^article/(d+)/$,article
POST请求 settings中 MIDDing 注释掉第四行
url改名字:涉及到url的都需要改,维护代价较大
硬编码/生写
解决:反向解析 render方向反向解析urls,再发送前端
urls:^login,app01.login,name="LOGIN"
views:<form action="{% url'LOGIN' %}" method="post">
视图部分:
url系统:url的路径与视图函数的映射关系
视图函数:requests 请求对象 属性:request.POST post请求数据组字典{}
request.method 请求方法字符串str
request.GET get请求数据字典{}
request.path 当次请求的路径
request.COOKIES
get方法:get_full_path() 全路径
pycharm console可查看print信息
多选 getlist():login.html
<p>爱好<inpput type="checkbox" name="hobby" value="1">篮球
<p>爱好<inpput type="checkbox" name="hobby" value="2">足球
<p>爱好<inpput type="checkbox" name="hobby" value="3">皮球
hobby=request.POST.get("hobby") print("hobby":hobby) 只能拿到一个爱好
hobby=request.POST.getlist("hobby") print("hobby":hobby) 拿到所有的爱好
response(响应对象):HttpResponse() render() redirect()
render()方法 render(request,template_name,context)
template_name模板
context上下文
urls:index/,index,name="INDEX"
vies:def index(request):s="yuan" db中取出的信息 return render(request,"index.html"),{"name":s}
template:index.html <h1>hello {{ name }}
拼路径 from MTV import settings
def index(request):import s;path=os.path.join(setting.BASE_DIR,"templates","index.html")
with open(path) as f:f.read()
data=data%s return HttpResponse(data)
redirect()本身是渲染 跳转 重定向
redirect("/login/");redirect("/路径/")
模拟点击
redirect与render的区别:redirect两次请求,render一次请求
template模板层:
功能:为了更有逻辑的将数据库中的数据渲染到模板中。
模板语法:变量 {{ }}
标量{% %}
深度查询 句点符.
{{ date }}默认对象的格式
{{ date.year }} 只获取其中年的信息
{{ date.month }}
person_list=[alex,egon,yuan]
{{ person_list }} 只是拿到了对象属性
{% for person_obj in %}
{{ person_obj.dream }}
{% endfor %} 方法中不能有参数
变量中的过滤器:{{ var|filter_name:参数 }}
{{ age|add:10 }} 在age=12的基础上再加10为22
{{ date|date:"Y-m-d" }}
{{ l|default:"nothing" }} 默认值
{{ l|length }} 长度
{{ 123123123|filesizeformat }}
{{ "hello world"|slice:"2:-1" }} 顾头不顾尾 -1为最后面的值
{{ "hellowoorld"|truncatewords="3" }} 按单词截
{{ "hellowoorld"|truncatechars="3" }} 按字符数量截
def index(request):render(request,"index.html",locals()) locals直接接收变量渲染到页面
index.html:{{ a_ele }}作为文本渲染出来了,而不是标签
安全机制原因,避免xml攻击或恶意攻击
评论内容:<script> for(1000) alert(123)
{{ a_ele|safe }} 标签会渲染出来
models模型层 表格增删改
新建Django项目bookManager 应用booklist
urls:
url(r'^index/', views.index),
url(r'^add/', views.add),
url(r'^del/(d+)', views.delete),
url(r'^edit/(d+)', views.edit),
views:
def index(request):
# 查询所有的0书籍
bookList=models.Book.objects.all();
return render(request,"booList/index.html",{"bookList":bookList})
def add(request):
if request.method == "POST":
title=request.POST.get("title");
pubDate=request.POST.get("pubDate");
price=request.POST.get("price");
publish=request.POST.get("publish");
models.Book.objects.create(title=title,pubDate=pubDate,price=price,publish=publish);
return redirect("/index/");
return render(request,"booList/add.html");
def delete(request,id):
models.Book.objects.filter(id=id).delete();
return redirect("/index/");
def edit(request,id):
if request.method == "POST":
title=request.POST.get("title");
pubDate=request.POST.get("pubDate");
price=request.POST.get("price");
publish=request.POST.get("publish");
models.Book.objects.update(title=title,pubDate=pubDate,price=price,publish=publish);
return redirect("/index/");
edit_bookList=models.Book.objects.filter(id=id)[0];
return render(request,"booList/edit.html",{"edit_bookList":edit_bookList});
templates: index.html add.html edit.html
models.py:
class Book(models.Model):
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
pubDate=models.DateField()
price=models.DecimalField(max_digits=6,decimal_places=2)
publish=models.CharField(max_length=32)
<link rel="stylesheet" href="/static/dist/css/bootstrap.css">
bookManage项目下新建package statics 复制bootstrap包中的dist到statics下
settings中的:
STATIC_URL = '/static/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,"static")
]
models.py
ORM ->model:pymysql模块 cursor.execute("select * from book")对象.方法->mysql->sql->db
ORM class Book:id,title... 类与对象的操作对应到sql操作
ORM坏处:慢
ORM好处:对数据库迁移特别方便
ORM映射:表记录-------类实例对象
表名----------类名
字段----------属性
models.py:
class Book(models.Model): 首字母大写
id=models.AutoField(primary_key=True) 自增约束1、数字类型,2、index索引
title=models.CharField(max_length=32)
pubDate=models.DateField()
price=models.DecimalField(max_digits=6,decimal_places=2) 总位数6位,小数点2位。
publish=models.CharField(max_length=32) decimal比double与float精度要高
settings DATABASE= sqlite3改成mysql 暂时使用sqlite3
Terminal:pytohn manage.py makemigratinos 应用bookList中生成了migrations下的py文件
Terminal:pytohn manage.py migrate 有db.sqlite3文件
打开database,将db.sqlite3拖入查看 只看bookList_book
确认settings中INSTALLed-APPs中是否有应用bookList
navicat图形化界面管理mysql
点击+号,输入字段信息 刷新保存