框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。
对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
importsocketdefhandle_request(client):buf=client.recv(1024)client.send("HTTP/1.1200OK\r\n\r\n".encode("utf8"))client.send("
最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。
如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。
正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。
这个接口就是WSGI:WebServerGatewayInterface。
-----------------------------Doawebframeworkourselves---------------------------
print(environ['PATH_INFO'])path=environ['PATH_INFO']start_response('200OK',[('Content-Type','text/html')])f1=open("index1.html","rb")data1=f1.read()f2=open("index2.html","rb")data2=f2.read()ifpath=="/yuan":return[data1]elifpath=="/alex":return[data2]else:return["
404
".encode('utf8')]ViewCodestep3Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表:
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
1、创建一个djangoproject
当前目录下会生成mysite的工程,目录结构如下:
2、在mysite目录下创建应用,比如blog:
3、启动django项目
4、同步更改数据库表或字段
5、清空数据库
此命令会询问是yes还是no,选择yes会把数据全部清空掉,只留下空表。
6、创建超级管理员
这个命令和直接运行python进入shell的区别是:你可以在这个shell里面调用当前项目的models.py中的API,对于操作数据的测试非常方便。
8、Django项目环境终端
ythonmanage.pydbshellDjango会自动进入在settings.py中设置的数据库,如果是MySQL或postgreSQL,会要求输入数据库用户密码。
在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。
9、更多命令
查看所有的命令,忘记子名称的时候特别有用。
10static配置
上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL中的值并以位置参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL中的值并以关键字参数传递给视图。
在Python正则表达式中,命名正则表达式组的语法是(P
下面是以上URLconf使用命名组的重写:
/articles/2005/03/请求将调用views.month_archive(request,year='2005',month='03')函数/articles/2003/03/03/请求将调用函数views.article_detail(request,year='2003',month='03',day='03')。在实际应用中,这意味你的URLconf会更加明晰且不容易产生参数顺序问题的错误——你可以在你的视图函数定义中重新安排参数的顺序。当然,这些好处是以简洁为代价;有些开发人员认为命名组语法丑陋而繁琐。
URLconf在请求的URL上查找,将它当做一个普通的Python字符串。不包括GET和POST参数以及域名。
URLconf不检查请求的方法。换句话讲,所有的请求方法——同一个URL的POST、GET、HEAD等等——都将路由到相同的函数。
每个捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式。例如,下面这行URLconf中:
url(r'^articles/(P
有一个方便的小技巧是指定视图参数的默认值。下面是一个URLconf和视图的示例:
django.conf.urls.url()函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。
例如:
fromdjango.conf.urlsimporturlfrom.importviewsurlpatterns=[url(r'^blog/(P
这个技术在Syndication框架中使用,来传递元数据和选项给视图。
urlpatterns=[url(r'^index',views.index,name='INDEX'),]###################defindex(req):ifreq.method=='POST':username=req.POST.get('username')password=req.POST.get('password')ifusername=='alex'andpassword=='123':returnHttpResponse("登陆成功")returnrender(req,'index.html')#####################