Skip to content

Commit 7de488b

Browse files
committed
Python: Flask: Moderize views
1 parent 63a09fc commit 7de488b

1 file changed

Lines changed: 34 additions & 33 deletions

File tree

  • python/ql/src/semmle/python/frameworks

python/ql/src/semmle/python/frameworks/Flask.qll

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,38 @@ private import semmle.python.ApiGraphs
1616
* See https://flask.palletsprojects.com/en/1.1.x/.
1717
*/
1818
private module FlaskModel {
19+
/** Provides models for flask view classes (defined in the `flask.views` module) */
20+
module Views {
21+
/**
22+
* Provides models for the `flask.views.View` class and subclasses.
23+
*
24+
* See https://flask.palletsprojects.com/en/1.1.x/views/#basic-principle.
25+
*/
26+
module View {
27+
/** Gets a reference to the `flask.views.View` class or any subclass. */
28+
API::Node subclassRef() {
29+
result =
30+
API::moduleImport("flask")
31+
.getMember("views")
32+
.getMember(["View", "MethodView"])
33+
.getASubclass*()
34+
}
35+
}
36+
37+
/**
38+
* Provides models for the `flask.views.MethodView` class and subclasses.
39+
*
40+
* See https://flask.palletsprojects.com/en/1.1.x/views/#method-based-dispatching.
41+
*/
42+
module MethodView {
43+
/** Gets a reference to the `flask.views.MethodView` class or any subclass. */
44+
API::Node subclassRef() {
45+
result =
46+
API::moduleImport("flask").getMember("views").getMember("MethodView").getASubclass*()
47+
}
48+
}
49+
}
50+
1951
// ---------------------------------------------------------------------------
2052
// flask
2153
// ---------------------------------------------------------------------------
@@ -95,37 +127,6 @@ private module FlaskModel {
95127
/** Gets a reference to the `add_url_rule` method on an instance of `flask.Blueprint`. */
96128
API::Node add_url_rule() { result = instance_attr("add_url_rule") }
97129
}
98-
99-
// -------------------------------------------------------------------------
100-
// flask.views
101-
// -------------------------------------------------------------------------
102-
/** Gets a reference to the `flask.views` module. */
103-
API::Node views() { result = flask_attr("views") }
104-
105-
/** Provides models for the `flask.views` module */
106-
module views {
107-
/**
108-
* Provides models for the `flask.views.View` class and subclasses.
109-
*
110-
* See https://flask.palletsprojects.com/en/1.1.x/views/#basic-principle.
111-
*/
112-
module View {
113-
/** Gets a reference to the `flask.views.View` class or any subclass. */
114-
API::Node subclassRef() {
115-
result = views().getMember(["View", "MethodView"]).getASubclass*()
116-
}
117-
}
118-
119-
/**
120-
* Provides models for the `flask.views.MethodView` class and subclasses.
121-
*
122-
* See https://flask.palletsprojects.com/en/1.1.x/views/#method-based-dispatching.
123-
*/
124-
module MethodView {
125-
/** Gets a reference to the `flask.views.MethodView` class or any subclass. */
126-
API::Node subclassRef() { result = views().getMember("MethodView").getASubclass*() }
127-
}
128-
}
129130
}
130131

131132
/**
@@ -187,7 +188,7 @@ private module FlaskModel {
187188
API::Node api_node;
188189

189190
FlaskViewClassDef() {
190-
this.getABase() = flask::views::View::subclassRef().getAUse().asExpr() and
191+
this.getABase() = Views::View::subclassRef().getAUse().asExpr() and
191192
api_node.getAnImmediateUse().asExpr().(ClassExpr) = this.getParent()
192193
}
193194

@@ -205,7 +206,7 @@ private module FlaskModel {
205206

206207
class FlaskMethodViewClassDef extends FlaskViewClassDef {
207208
FlaskMethodViewClassDef() {
208-
this.getABase() = flask::views::MethodView::subclassRef().getAUse().asExpr() and
209+
this.getABase() = Views::MethodView::subclassRef().getAUse().asExpr() and
209210
api_node.getAnImmediateUse().asExpr().(ClassExpr) = this.getParent()
210211
}
211212

0 commit comments

Comments
 (0)