python django框架(一)
s4day63内容回顾:
1. 安装
2. 创建用户 + 授权
3.
连接
- 数据库
终端创建数据库(字符编码)
- 数据表
终端
ORM
pymysql
create ...)engine=innodb
- 数据行
增
删
改
查
- limit
- group by
....
关闭
问题:简述ORM原理?
day64内容
1. 自己开发Web框架
- socket
- http协议
- HTML知识
- 数据库(pymysql,SQLAlchemy)
HTTP特点:
无状态、短连接
TCP:
不断开
WEB应用(网站):
Http协议:
发送:
POST /index HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
HTTPS: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni
p=123
响应:
200 OK
Cache-Control:public, max-age=15
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Wed, 14 Jun 2017 01:21:17 GMT
Expires:Wed, 14 Jun 2017 01:21:33 GMT
Last-Modified:Wed, 14 Jun 2017 01:21:03 GMT
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Frame-Options:SAMEORIGIN
X-UA-Compatible:IE=10
用户在页面看到的内容“字符串”(看到页面效果,由于浏览器解析)
浏览器(socket客户端)
2. www.cnblogs.com
(42.121.252.58,80)
sk.socket()
sk.connect((42.121.252.58,80))
sk.send('我想要xx')
5. 接收
6. 连接断开
博客园(socket服务端)
1. 监听ip和端口(42.121.252.58,80)
while True:
用户 = 等待用户连接
3. 收到'我想要xx'
4. 响应:“好”
用户断开
连接示例
import socket sock = socket.socket()
sock.bind(('127.0.0.1',))
sock.listen() while True:
conn,addr = sock.accept() # hang住
# 有人来连接了
# 获取用户发送的数据
data = conn.recv()
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
conn.send(b'')
conn.close()
连接示例(伪代码)
2. Django框架
常见python web框架:django(内容大而全),tornado,flask(轻量级),web.py(尽量不用)
form表单验证
操作数据库
缓存
wsgiref实现网关接口 WSGI:(Web Server Gateway Interface),业务开发中尽量用UWSGI.
讲Django之前时说的web 框架原理:
创建完项目(project)之后,写代码之前先配置模板路径(template),静态文件
python manage.py runserver运行起来,就能访问了 127.0.0.1:8000/login
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', MIDDLEWARE中含有CSRF这一行注释掉
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
3.函数
函数至少一个参数(request) request包括请求相关的所有信息
request.method获取用户的提交方式,request.post获取用户以POST方式用表单提交过来的数据
request.get获取用户以GET方式在URL上提交过来的数据
函数返回数据:return值有:
1.return http response 返回字符串用的;
2.return render 给他一个数据,给他一个模板(html文件)
3.return redirect,重定向到某个URL地址
模板渲染的时候,还可以利用Django提供的渲染机制,模板:两个大括号,中间写个值,如{{ name }}.
静态文件后面记得加括号
urls多加了一个条件,多加了一个对应关系
以POST方式提交数据的时候,不光request.post有值,request.get里面也有值
以GET方式提交数据的时候,只有request.get有值
GET请求--->只有request.GET有值
POST请求--->request.POST和request.GET都有值
4.url对应关系
/login/ login
def login(request):
request.method
request.POST->请求体
request.GET->请求头
导入的模块如下
from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import HttpResponse,render,redirect
return HttpResponse(返回字符串)
return render(request,'login.html',{}) :执行渲染
return redirect('要跳转的网址') (redirect:重定向)
5.模板引擎中的特殊标记
login.html
{{name}} :name这个特殊标记就换成了alex
def login(request):
return render(request,'login.html',{'name':'alex'}) : {'name':'alex'}字典
<p>{{ users.0 }}</p> 取列表里的第一个值
<p>{{ users.1 }}</p> 取列表里的第二个值
模板里的特殊标记里还支持循环
{% for item in users %}
{{ item }}
{% endfor %}
<table>
{% for row in user_list_dict %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.name }}</td>
<td>{{ row.email }}</td>
</tr>
{% endfor %}
</table>每一次循环进来生成一个tr(table row)
今日作业
Django+pymysql实现
-用户登录
-查看用户列表 alex alex3714@.com 编辑 | 删除 点击删除,跳转到另外一个地址
alex alex3714@.com 编辑 | 删除
alex alex3714@gmail.com 编辑 | 删除
0615作业需求
总结:Django(必须学会,web框架着重理解)
web框架:模板引擎+路由映射+socket
Django用于快速开发网站,快速开发业务系统(BBS+豆瓣)
Django安装: pip3 install django
Django启动: 在cmd下运行 django-admin startproject 文件夹名(比如mysite),在对应磁盘创建相应的mysite目录
D:\Program Files\Python36\Scripts文件夹下出现一个exe文件django-admin.exe和一个django-admin.py
D:\Program Files\Python36\Scripts这一段加到Windows环境变量
WSGI:web服务网关接口
wsgiref,uwsgi 两个模块
D:\mysite\mysite 有三个文件:
1.settings.py:存放Django的配置文件,
2.urls.py存放URL和函数的对应关系,起名叫:路由系统,
3.wsgi.py:用于定义Django用socket,wsgiref,uwsgi(性能高),调用wsgiref这个模块,wsgi是web服务网关接口,是一个协议,
这个协议按照这个规则实现socket,wsgiref是实现这个协议的.
C:\Users\bing>django-admin startproject bingsite 启动Django服务
C:\Users\bing>D:
D:\>cd bingsite 切换目录
D:\bingsite>python manage.py runserver 127.0.0.1:8090 连接服务
python manage.py runserver 后面不加ip+端口,默认会以127.0.0.1:8000启动
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
June 14, 2017 - 19:52:11
Django version 1.11.1, using settings 'bingsite.settings'
Starting development server at http://127.0.0.1:8090/
Quit the server with CTRL-BREAK.
在浏览器访问http://127.0.0.1:8090/ 这个地址:
It worked!
Congratulations on your first Django-powered page.
from django.shortcuts import HttpResponse导入模块内容
def login(request):
'''
:param (request):放置用户请求相关的所有信息(对象)
:return
'''
返回一个字符串
settings.py里的'DIRS': [os.path.join(BASE_DIR, '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',
],
},
},
]
settings.py文件中的TEMPLATES代码
{%csrf_token%}这一句放在form标签里面:csrf_token用于表单验证。
笔记整理
一、WEB框架的本质
WEB框架的本质是 开启一个socket服务端,用户发送http请求(get/post),服务端内部根据不同的URL请求,发送给用户不同的模板(html网页本质是发送字符串);
二、WEB框架的组成
1. socket服务端
绑定唯一IP+端口,不间断提供服务,让用户连接;
2、路由系统:URL -> 函数
根据不同URL请求,返回不同的模板;
3、模板引擎渲染:(包含在模板中特殊字符 % 特定数据的替换)
把特定数据(例如来自数据库) 根据包含在模板中(HTML网页)定义的特殊字符{{特殊字符}} ,替换组织成特定字符串整体发送给客户端。
三、WEB框架种类
第一类:同时满足1,2,3条件Tornado
第二类:[第三方1],2,3 --> wsgiref -例如Django
第三类: [第三方a],b,[第三方c] -例如: flask,
四、创建Django框架:
1、在CMD创建Django项目
1.1.安装Django模块:pip3 install django
1.2、创建Django程序 django-admin startproject mysite
1.3、进入程序目录 cd mysite
1.4、启动socket服务端,等待用户发送请求 python manage.py runserver 127.0.0.1:8080
2、在Pycharm创建Django项目
左上角file--->NewProject--->
五、Django目录配置
1、Django框架包含的文件说明:
seting.py -----Django的配置文件
url.py--------路由系统(url和函数的对应关系)
wsgi.py-------用于定义该Django程序,用什么socket来实现。wsgirof(测试环境) ,uwsgi(生产环境)
manage.py------对Django程序的所有操作和管理基于该程序例:Python manage.py run server 启动Django程序
2.配置
2.1、模板路径配置(html文件存放位置)
seting.py
TEMPLATES = [
{'DIRS': [os.path.join(BASE_DIR, 'templates')]
2.2、静态文件配置(CSS文件存放位置)
STATIC_URL = '/static/'
STATICFILES_DIRS=(
os.path.join(BASE_DIR,'static'),
)
2.3额外配置(注释)
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
总结:
1、创建project
2、配置
-------配置模板路径
-------配置静态文件路径
-------额外配置
六、使用Django
1、路由系统
urlpatterns = [url(r'URL/',URL对应的处理函数),]
urlpatterns = [url(r'login/',login),] ---------URL对应的函数
2、处理函数
请求相关:
request对象的属性和方法:(客户端请求相关)
request.method 提取请求的方法
request.get 提取get请求头的URL
request.POST 提取POST请求体,用户输入的数据体;
{'username': ['zhanggen'], 'password': ['123.com']}
返回相关:
return HttpResponse("666") #返回字符串
retrun redirect("http://www.baidu.com") 返回跳转的网页
render内部做模板渲染(把模板拿过来,把数据拿过来,把特殊字符做字符串替换)
return render(request, "logi.html",{'msg':"用户名或者密码错误"})(返回网页)
def login(request):
# return HttpResponse("") #返回字符串
if request.method=="GET":
print(request.method)
return render(request,"logi.html") # 返回静态文件
else:
u=request.POST.get("username")
p=request.POST.get("password")
print(u,p)
if u=="zhanggen" and p=="123.com":
return redirect("http://www.baidu.com")
else:
return render(request, "logi.html",{'msg':"用户名或者密码错误"}) def index(request):
return render(request,"index.html",{"name":"alex",
"users":["李志","李杰"]
,"user_dict":{"k1":"v1","k2":"v2"}, 'user_name':[{'id':,'name':"张根","gender":"man"},
{'id': , 'name': "游勤兵", "gender": "man"},
{'id': , 'name': "高路川", "gender": "man"} ] }) urlpatterns = [
url(r'login/',login),
url(r'index/',index),
]
代码示例1
3、模板引擎中的特殊标记
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ss</title>
</head>
<body>
<h1>模板特殊标记</h1>
<p>{{name}}</p>
<p>{{users.}}</p>
<p>{{users.}}</p>
<p>{{user_dict.k2}}</p>
<p>{{user_dict.k1}}</p>
<h3>循环</h3>
{% for item in user_dict %}
<h1>{{ item }}</h1>
{% endfor %} <table border="">
{% for row in user_name%} <tr>
<td>{{ row.id }}</td>
<td>{{ row.name }}</td>
<td>{{ row.gender }}</td>
<td><a href="">编辑|删除</a></td> </tr>
{% endfor %}
</table> </body>
</html>
代码示例2
python django框架(一)的更多相关文章
- [Python] Django框架入门
说明:Django框架入门 当前项目环境:python3.5.django-1.11 项目名:test1 应用名:booktest 命令可简写为:python manager.py xxx => ...
- 利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!
利用 Python django 框架 输入汉字,数字,字符,等..转成二维码! 模块必备:Python环境 + pillow + qrcode 模块 核心代码import qrcode qr = ...
- Python Django框架笔记(五):模型
#前言部分来自Django Book (一) 前言 大多数web应用本质上: 1. 每个页面都是将数据库的数据以HTML格式进行展现. 2. 向用户提供修改数据库数据的方法.(例如:注册.发表评 ...
- Python Django框架笔记(三):django工作方式简单说明和创建用户界面
(一) 说明 简单说明下django的工作方式,并举2个例子. (二) Django工作方式 假定我们有下面这些文件 ,这里在前2篇的基础上增加了 templates目录(存放html文件) 和s ...
- Python Django框架笔记(一):安装及创建项目
#推荐一本书<Python核心编程>(适合有一定基础的),美国人Wesley Chun编写的,京东.淘宝应该都有.我是觉得写的很好,详细.简洁.满满的干货,不像有的书整本看完也没什么用. ...
- [Python] Django框架入门5——静态文件、中间件、上传图片和分页
说明: 本文主要描述Django其他的内容,涉及静态文件处理.中间件.上传文件.分页等. 开发环境:win10.Python3.5.Django1.10. 一.静态文件处理 在Django项目的静态文 ...
- python Django框架正式准备工作
之前由于不太了解数据库方面的知识,但经过一段时间的web应用的开发学习,成功的用其他框架连接了数据库,并完成了相关操作,数据爬取也初识了,更了解了python这门语言的语法,但路还很长,因此现在才能正 ...
- python django框架+vue.js前后端分离
本文用于学习django+vue.js实现web前后端分离协作开发.以一个添加和删除数据库书籍应用为实例. django框架官方地址:https://www.djangoproject.com/ vu ...
- Python Django框架笔记(六):模板
(一){%%}和{{ }} {% for post in posts %} <a href=""><h2>{{ post.title }}</h2&g ...
随机推荐
- thinkphp使用阿里云OSS最新SDK,文件部署
这文章是建立在你已经注册号阿里云的OSS,和创建好Bucket前提下: 其实阿里云的帮助与文档写的很详细,这里只说一下源码方式 1.phpsdk下载地址(摘自阿里云OSS的帮助与文档)(也有我自己下载 ...
- vue指令详解
一.vue简绍 1. Vue.js是什么 Vue.js也称为Vue,读音/vju:/,类似view,错误读音v-u-e. 版本分为v1.0 和 v2.0 2.Vue.js的特点 1. 是一个构建 ...
- Php ArrayIterator的几个常用方法
搜索商低..从php.net找到 ,自己翻译一下 总结在一起 rewind() 指针回到初始位置 valid() 判断数组当前指针下是否有元素 key() 数组键 ...
- hibernate 一对多、多对多的配置
一对多 <class name="Question" table="questions" dynamic-insert="true" ...
- BZOJ 3689: 异或之
字典树可以$o(logn)查找第k大$ 使用$可持久化Trie 区间查找第k大,然后首先把每个数异或之后的最小丢进小根堆中,然后一个一个取出,取出后就再丢次小,一共取k次$ 总的时间复杂度为$O(kl ...
- cdoj1342郭大侠与甲铁城
地址:http://acm.uestc.edu.cn/#/problem/show/1342 题目: 郭大侠与甲铁城 Time Limit: 1500/800MS (Java/Others) ...
- 双摄像头测距的OpenCV实现
http://blog.csdn.net/scyscyao/article/details/5562024 版权声明:本文为博主原创文章,未经博主允许不得转载. 虽然最近注意力已经不可遏制地被神经科学 ...
- 一年java程序员的感悟
前沿 在小公司干了差不多一年,刚进来与一个中级程序员做交接,过了大概一个月,那个中级程序员走了,从此,走上了"泥泞"的道路(独立开发),熟悉了公司的项目和业务用了一个月左右,公司当 ...
- EasyUI:datagrid数据汇总
EasyUI:datagrid数据汇总 js代码: var total=0;//全局变量 $(function(){ $('#tablebudgetdata').datagrid({ title:' ...
- UIScrollView监听静止的数种情况
1.直接通过block -(void)testInBlock { //通过block监听 [UIView animateWithDuration:1.0 animations:^{ self.scro ...